Страница 1 из 1
Рекурсивное прерывание
Добавлено: Чт фев 19, 2009 15:06:34
ytkopobot
Надо реализовать по нажатию на кнопочку рекурсивное прерывание.
Не совсем представляю как из обычного сделать рекурсивное? То есть чтоб могло само себя прерывать..
Пишу я для 51-го
Добавлено: Чт фев 19, 2009 15:50:52
Димуля
рекурсивное прерывание... хм... в своё время причиной половины всех зависаний операционной системы MS-DOS было именно рекурсивное прерывание... а вторая половина - неправильная работа с памятью, но "сейчас не об этом"... Как вы себе представляете работу рекурсивного прерывания?!

Добавлено: Чт фев 19, 2009 17:36:08
ytkopobot
Пишу программу для 51го - определитель номера (но это неважно) smile.gif .
Уже сохранённые номера хранятся в памяти.
Есть кнопочка, то есть внешнее прерывание, для пролистывания номеров.
Когда я нажала на кнопочку, прерывание сработало и показывает, ну пусть минуту, номер. Но я не могу сообразить как сделать, чтобы загорелся следующий номер, если я нажму на кнопку раньше чем через минуту.
Получается что моё прерывание должно прерваться собой же...
вот.
Сказали что это называется рекурсивное прерывание:)
Добавлено: Чт фев 19, 2009 17:54:13
smac
ytkopobot писал(а):
Получается что моё прерывание должно прерваться собой же...
вот.
Сказали что это называется рекурсивное прерывание:)
Не надо рекурсивных прерываний, тем более вы хотите ждать в прерывании секунду (такие задержки в прерываниях - плохой тон и объектвно их быть не должно) Выход в следующем: в прерывании выставляйте флаг - показать номер, и выходите из прерывания, в основном цикле выполняйте ф-ю "показать номер". Если прерывание возникает еще раз во время выполнения ф-и то оно обработается своим обработчиком и снова установится флаг. Можно вместо флагов придумать счетчик нажатий или еще что-то, в общем решений куча.
Добавлено: Чт фев 19, 2009 17:59:20
ytkopobot
нда и правда.. спасибо за совет

Буду пробовать

Добавлено: Чт фев 19, 2009 22:45:02
Yellow Tiger
Что-то типа такого:
Код: Выделить всё
прерывание_от_кнопки()
{
таймаут = одна_минута;
++индекс_номеров; // можно еще проверять на выход за верхнюю границу
}
прерывание_от_таймера()
{
if (индекс_номеров && !--таймаут)
{
--индекс_номеров;
}
}
Добавлено: Пт фев 20, 2009 14:00:02
Aheir
Вообще, мне кажется, не очень правильным делать прерывание по кнопке, тем более, что кнопок там будет явно больше, чем одна. Гораздо правильнее, на мой взгляд, организовать опрос кнопок по таймеру, выставляя только флаги нажатости той или иной кнопки, а сами флаги обрабатывать уже в другом месте программы.
Любые задержки в прерываниях, как уже было сказано, не есть хорошо.
Добавлено: Пт фев 20, 2009 21:09:44
Yellow Tiger
Вообще, как тут не так давно выяснилось, метода обрабатывать события от кнопок (прерывания или поллинг) - это еще один повод для религиозной войны. Причем, аргументы в этой войне столь же мало важны, как и в любой другой войне, хоть она и религиозная.
Рискуя спровоцировать еще одно сражение упомянутой войны, отмечу, что приведенные аргументы - количество кнопок и необходимость обрабатывать прерывание как можно скорее - не нарушаются от того лишь, что выбрана метода работы по прерываниям, так как, сколько бы кнопок ни было, прерывание на все - одно, а время обработки прерывания поддерживается коротким путем выноса длительных процедур в основной цикл и выставления флагов в обработчике. В частности, мой пример эквивалентен выставлению двух флагов:
1 - начать_отсчет_таймаута
2 - отметить_новый_уровень_вложенности
а вот процедура индикации ("
показывает, ну пусть минуту, номер") уже должна вызываться в основном цикле, это - дааа...

Добавлено: Пт фев 20, 2009 23:45:58
mackerel
Всё-таки поллинг (или как это было названо - опрос кнопок по таймеру), на мой взгляд, гораздо удобнее прерывания от кнопок.
Ну, во-первых, что, собственно за событие должно вызвать прерывание?
Нажатие любой кнопки? А дребезг? Какой смысл реагировать на каждый "чих"... А с поллингом подавление дребезга - милое дело, если состояние кнопок (любого количества, причём) не меняется N циклов - считаем его истинным. Удобно, что так и нажатия фиксируются, и, если нужно, отпускания.
Опять же, если уже есть линии сканирования, то это почти "бесплатная" основа для динамической индикации. А само прерывание от таймера достаточно небольшое получается, много времени не занимает.
Ну, конечно, если кнопок - одна-две... И индикации нету (или простенькая)...
Добавлено: Пт фев 20, 2009 23:56:23
Yellow Tiger
mackerel писал(а): с поллингом подавление дребезга - милое дело, если состояние кнопок (любого количества, причём) не меняется N циклов...
Да, милое, если ресурсы процессора больше не на что тратить.

Как известно, человек - сааамое медленное внешнее устройство, поэтому код, срабатывающий от нажатия кнопок будет работать очень редко, а вот поллинг будет оттягивать свой процент ЦПУ
всегда...
Не стоит утверждать, что во всех случаях лучше та или другая техника - нужно учитывать особенности девайса и выбирать то, что лучше подходит к данному случаю. По моему опыту, для асинхронных событий чаще правильным оказывается именно работа прерываниями. Но это может выглядеть иначе в очень небольших и короткоживущих проектах, а также, при штучном изготовлении. Относительно недавно я это уже обсуждал здесь.

Добавлено: Сб фев 21, 2009 22:16:28
Aheir
Yellow Tiger, абсолютно согласен, всегда смотрим по ситуации, что лучше подходит, то и пользуем. Так что воевать не будем, не нужно оно нам.

Добавлено: Сб фев 21, 2009 22:36:04
Yellow Tiger
Уважаю взвешенный подход!

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