Рекурсивное прерывание

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Аватара пользователя
Сообщения: 4
Зарегистрирован: Вс июн 01, 2008 13:50:04
Откуда: г. Томск

Сообщение ytkopobot »

Надо реализовать по нажатию на кнопочку рекурсивное прерывание.
Не совсем представляю как из обычного сделать рекурсивное? То есть чтоб могло само себя прерывать..
Пишу я для 51-го
Контактная информация:
Реклама
Открыл глаза
Сообщения: 53
Зарегистрирован: Сб ноя 29, 2008 21:07:04

Сообщение Димуля »

рекурсивное прерывание... хм... в своё время причиной половины всех зависаний операционной системы MS-DOS было именно рекурсивное прерывание... а вторая половина - неправильная работа с памятью, но "сейчас не об этом"... Как вы себе представляете работу рекурсивного прерывания?! :shock:
Изображение
Реклама
Родился
Аватара пользователя
Сообщения: 4
Зарегистрирован: Вс июн 01, 2008 13:50:04
Откуда: г. Томск

Сообщение ytkopobot »

Пишу программу для 51го - определитель номера (но это неважно) smile.gif .
Уже сохранённые номера хранятся в памяти.
Есть кнопочка, то есть внешнее прерывание, для пролистывания номеров.
Когда я нажала на кнопочку, прерывание сработало и показывает, ну пусть минуту, номер. Но я не могу сообразить как сделать, чтобы загорелся следующий номер, если я нажму на кнопку раньше чем через минуту.
Получается что моё прерывание должно прерваться собой же...
вот.
Сказали что это называется рекурсивное прерывание:)
Контактная информация:
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

ytkopobot писал(а): Получается что моё прерывание должно прерваться собой же...
вот.
Сказали что это называется рекурсивное прерывание:)
Не надо рекурсивных прерываний, тем более вы хотите ждать в прерывании секунду (такие задержки в прерываниях - плохой тон и объектвно их быть не должно) Выход в следующем: в прерывании выставляйте флаг - показать номер, и выходите из прерывания, в основном цикле выполняйте ф-ю "показать номер". Если прерывание возникает еще раз во время выполнения ф-и то оно обработается своим обработчиком и снова установится флаг. Можно вместо флагов придумать счетчик нажатий или еще что-то, в общем решений куча.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Аватара пользователя
Сообщения: 4
Зарегистрирован: Вс июн 01, 2008 13:50:04
Откуда: г. Томск

Сообщение ytkopobot »

нда и правда.. спасибо за совет :) Буду пробовать :)
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Что-то типа такого:

Код: Выделить всё

прерывание_от_кнопки()
{
    таймаут = одна_минута;
    ++индекс_номеров; // можно еще проверять на выход за верхнюю границу
}

прерывание_от_таймера()
{
    if (индекс_номеров && !--таймаут)
    {
        --индекс_номеров;
    }
}
Реклама
Модератор
Аватара пользователя
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург

Сообщение Aheir »

Вообще, мне кажется, не очень правильным делать прерывание по кнопке, тем более, что кнопок там будет явно больше, чем одна. Гораздо правильнее, на мой взгляд, организовать опрос кнопок по таймеру, выставляя только флаги нажатости той или иной кнопки, а сами флаги обрабатывать уже в другом месте программы.
Любые задержки в прерываниях, как уже было сказано, не есть хорошо.
Оптимизм х (Опыт + Знания) = const
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Вообще, как тут не так давно выяснилось, метода обрабатывать события от кнопок (прерывания или поллинг) - это еще один повод для религиозной войны. Причем, аргументы в этой войне столь же мало важны, как и в любой другой войне, хоть она и религиозная.
Рискуя спровоцировать еще одно сражение упомянутой войны, отмечу, что приведенные аргументы - количество кнопок и необходимость обрабатывать прерывание как можно скорее - не нарушаются от того лишь, что выбрана метода работы по прерываниям, так как, сколько бы кнопок ни было, прерывание на все - одно, а время обработки прерывания поддерживается коротким путем выноса длительных процедур в основной цикл и выставления флагов в обработчике. В частности, мой пример эквивалентен выставлению двух флагов:
1 - начать_отсчет_таймаута
2 - отметить_новый_уровень_вложенности
а вот процедура индикации ("показывает, ну пусть минуту, номер") уже должна вызываться в основном цикле, это - дааа... 8)
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт янв 30, 2009 18:02:40

Сообщение mackerel »

Всё-таки поллинг (или как это было названо - опрос кнопок по таймеру), на мой взгляд, гораздо удобнее прерывания от кнопок.
Ну, во-первых, что, собственно за событие должно вызвать прерывание?
Нажатие любой кнопки? А дребезг? Какой смысл реагировать на каждый "чих"... А с поллингом подавление дребезга - милое дело, если состояние кнопок (любого количества, причём) не меняется N циклов - считаем его истинным. Удобно, что так и нажатия фиксируются, и, если нужно, отпускания.
Опять же, если уже есть линии сканирования, то это почти "бесплатная" основа для динамической индикации. А само прерывание от таймера достаточно небольшое получается, много времени не занимает.

Ну, конечно, если кнопок - одна-две... И индикации нету (или простенькая)...
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

mackerel писал(а): с поллингом подавление дребезга - милое дело, если состояние кнопок (любого количества, причём) не меняется N циклов...
Да, милое, если ресурсы процессора больше не на что тратить. ;)
Как известно, человек - сааамое медленное внешнее устройство, поэтому код, срабатывающий от нажатия кнопок будет работать очень редко, а вот поллинг будет оттягивать свой процент ЦПУ всегда...
Не стоит утверждать, что во всех случаях лучше та или другая техника - нужно учитывать особенности девайса и выбирать то, что лучше подходит к данному случаю. По моему опыту, для асинхронных событий чаще правильным оказывается именно работа прерываниями. Но это может выглядеть иначе в очень небольших и короткоживущих проектах, а также, при штучном изготовлении. Относительно недавно я это уже обсуждал здесь. :)
Модератор
Аватара пользователя
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург

Сообщение Aheir »

Yellow Tiger, абсолютно согласен, всегда смотрим по ситуации, что лучше подходит, то и пользуем. Так что воевать не будем, не нужно оно нам. :)
Оптимизм х (Опыт + Знания) = const
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Уважаю взвешенный подход! Изображение :)))
Друг Кота
Аватара пользователя
Сообщения: 3051
Зарегистрирован: Пт авг 10, 2007 12:49:55
Откуда: kr.ua

Сообщение NiTr0 »

Опрос кнопок ИМХО проще делать в основном цикле по остаточному принципу, а события, требующие реал-тайм реакции - выносить в прерывания. Хотя если задачи очень ресурсоемкие - тут уже возможны варианты...
Кстати насчет поллинга - я обычно просто делаю интервал в 100 мсек, человек быстрее кнопки нажимать не будет, а дребезг - 100 мсек (от 1-й единицы до последнего нуля) явно не продлится. Проблем еще не наблюдал.
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»