И все же я считаю, что через прерывание сложнее. Вот например каким образом делать фильтрацию дребезга контактов? В потоке я могу опрашивать состояние кнопки к примеру в течении 50 мс и если уровень низкий, то считать кнопку нажатой. В прерывании же от дребезга придет куча событий и дальше тишина, что делаем дальше? :)
Комментарии: 17
Aleksandr
Считаем время между срабатываниям. Или, например, выключаем прерывание на определенное время. Ну или аппаратно. Конденсатор.
Anton
Между срабатываниями чего? Считаем чем, аппаратным таймером? Знаете, я таймеру найду более полезное применение. Аппаратно, конденсатор да, выручает, но не всегда.
Aleksandr
Системные тики считаем
Anton
Не, ну вот допустим нажали мы кнопку. Пошел дребезг из 6 импульсов друг за дружкой потом тишина. Прерывание вызвалось эти 6 раз. И?
Aleksandr
Глобальная переменная записывает тик срабатывания. Дальше в каждом из следующих считаем разницу и фильтруем.
Anton
Сколько сложностей на пустом месте называется и ради чего самое то главное :)
Aleksandr
Ну это смотря что экономить. Как выше и отмечали. Если ценно процессорное время или энергосбережение - в лоб вообще не решить.
Anton
С процессорным временем еще довольно спорный момент, куда его уйдет больше, на все эти ваши очереди, перекидывания данных из перывания и так далее, потом вы все равно где - то будете это фильтровать и на это тоже уйдет процессорное время. Так что выгода сомнительна, а усложнение логики программы довольно ощутимо. Будить то можно и по прерыванию, а потом обрабатывать в потоке.
Anonim
фильтрация и прочее происходит в прерывании, система получает только статус кнопки
Aleksandr
Так я вроде, так и написал...
Anton
Это я в курсе, что еще хуже как по мне. Т.к. пока крутимся в прерывании, остальной код не исполняется.
Anonim
пока заходим в задачу кнопок, крутимся в ней - тоже не исполняется) и не исполняется 100 раз в секунду
Anton
Проверка пары статусов и delay, который отдает исполнение другой задаче...
Anonim
проверка пары счетчиков, установка переменной и выход из прерывания один раз за нажатие, замечу не сто раз в секунду
Anton
Может оно и так, но потом начинает добавляться... А я хочу отлавливать событие долгого нажатия, хочу отлавливать даблклик и понеслось.....
Aleksandr
Так по сути тоже самое, только 100 раз в секунду? Код фильтрации и проверки будет одинаковый
Anton
Может оно и так, конечно, но реализация выше перечисленных функций в прерывании уже будет сложнее. Более того не всегда есть возможность использовать прерывания, не все ноги имеют возможность генерировать прерывания или состояние клавиатуры вообще приходит по каким - то каналам связи, например SPI... много бывает ситуаций, которые не разрулишь в прерывании :) Не я согласен, если у тебя одна кнопка и нужно будить по её нажатию девайс, тут можно и прерывание заюзать, даже лучше будет....