|
Обработка нажатия кнопок, где и как устранять дребезг контактов |
|
|
|
Feb 10 2009, 06:06
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
... опрос клавиатуры по прерыванию, устранение дребезга контактов.... Подскажите как, с точки зрения RTOS, поступать правильнее : а) в прерывании от кнопок "сигналить" процессу, а уже в нем вводить паузу через Sleep(..), счивать скан-код, разрешать прерывания. б) паузу вводить в прерывании, там же получать скан, разрешать прерывания и, как писал в форуме dxp, отправлять процессу сообщение (а не флаг). ... Если "б)", то чем реализовывать паузу?
недостатки способов относительно друг друга (на мой взгляд): для "а)" - сохранение контекста процесса обработки кнопок при "падении" в спячку (для реализации паузы); работа с прерыванием (разрешение прерывания) в процессе, а не в теле прерывания /"..баня, а через дорогу раздевалка.."/ для "б)" - "длинное" прерывание.
|
|
|
|
|
 |
Ответов
(1 - 6)
|
Feb 10 2009, 07:10
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Вы правы: отдельный процесс для обрабоки нажатия кнопок должен быть вне зависимости от способа реализации обработки; процесс этот низкоприоритетный и другим, более важным, процессам мешать не может (чего не скажешь о прерывании); да и "сложности", например, с выявлением длительного нажатия кнопок сводят на нет кажущуюся простоту INT-подхода. Павильное решение - периодический опрос состояния кнопок из процесса. Спасибо.
|
|
|
|
|
Feb 10 2009, 09:29
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
И еще мнение, "..в догонку.." Во-первых, так ли уж необходимо производить опрос через флаг, устанавливаемый сис.таймером? Цитата(MrYuran @ Feb 10 2009, 09:25)  .... намного проще опрашивать порт по таймеру. То есть, системный таймер выставляет флаг раз в 2-5 мс, по этому флагу отдельный поток считывает порт .... , разве не проще через Sleep(n) в самом процессе? /нет необходимости ни флаг создавать, ни конструкцию "сочинять" для установки флага с периодом, отличным от периода сис.тика (напр., флаг нужен через 3мс, а тик равен 1мс. А для Sleep(n) -> n=3 и "..все..")/. ... И если "останавливаться" на Sleep(n), то не проще ли опрашивать через время достаточное для устранения дребезга... Общепринятым считается: - опрос состоятия через ~2..10мк; - при получении изменения "задержка" опроса на ~50мс /тут два варианта или "пауза", или подсчет числа обращений (3мс х 17 раз = 51 мс). Для RTOS приемлем последний вариант, посностью согласен с MrYuran/ ; - повторный опрос; - принятие решения. А что если производить опрос через 50мс? Получается: - опрос /обнаружено изменение/; - задержка 50мс; - повторный опрос; - принятие решения. Дествия те же, но вот для RTOS от 17 (в нашем примере) циклов переключения процессов, со всеми вытекающими..., удается избавиться. ... Что теряем? - Увеличивается время реакции на нажатие с 3мс до 50мс. Но при скорости печатания 150 знаков/мин (это очень хороший результат, обычно 100...120) время между нажатиями 60/150 = 400мс. А предполижить, что кнопками прибора бутут пользоваться с такой скоростью затруднительно.. То есть, применительно к EmbeddedDevice, вероятность пропуска нажатия кнопки еще меньше. .... Быть может такое мнение ошибочно?
|
|
|
|
|
Feb 11 2009, 07:13
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Stas633 @ Feb 10 2009, 12:29)  разве не проще через Sleep(n) в самом процессе? /нет необходимости ни флаг создавать, ни конструкцию "сочинять" для установки флага с периодом, отличным от периода сис.тика (напр., флаг нужен через 3мс, а тик равен 1мс. А для Sleep(n) -> n=3 и "..все..")/. ... Конечно проще. Возможно, MrYuran описывал случай без ОС (без процессов/потоков): тогда в прерывании таймера можно устанавливать флаг, а в главном цикле по этому флагу делать опрос. Цитата(Stas633 @ Feb 10 2009, 12:29)  И если "останавливаться" на Sleep(n), то не проще ли опрашивать через время достаточное для устранения дребезга... Конечно проще. Тут всё зависит от конкретного применения. Чем сильнее мы фильтруем дребезг, тем больше рискуем пропустить законные нажатия на кнопку. Где-то это не важно (кому надо, подержат кнопку подольше), а где-то - очень важно. Опять же, в разных применениях требуются разные события от клавиатуры: где-то только нажатие кнопки, где-то - нажатие и отпускание, а где-то - нажатие, автоповтор с задержкой и отпускание. Исходя из требований и выбирается алгоритм. Цитата(Stas633 @ Feb 10 2009, 12:29)  Что теряем? - Увеличивается время реакции на нажатие с 3мс до 50мс. Но при скорости печатания 150 знаков/мин (это очень хороший результат, обычно 100...120) время между нажатиями 60/150 = 400мс. А предполижить, что кнопками прибора бутут пользоваться с такой скоростью затруднительно.. Я бы посоветовал посадить за клавиатуру машинистку и снять осциллограммы. Я думаю, там будут импульсы и покороче, чем 50мс.
|
|
|
|
|
Feb 11 2009, 07:29
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Stas633 @ Feb 10 2009, 12:29)  Что теряем? - Увеличивается время реакции на нажатие с 3мс до 50мс. Но при скорости печатания 150 знаков/мин (это очень хороший результат, обычно 100...120) время между нажатиями 60/150 = 400мс. Быть может такое мнение ошибочно? Меня лично (уверен, что не только меня) очень раздражает задумчивость и нечёткое срабатывание кнопок. То есть, реакция устройства не должна быть медлительнее человеческих органов чувств (глаз, к примеру), иначе создаётся очень неприятное впечатление от общения с такими поделками. Один из примеров - дект телефон филипс. "резиновость" кнопок просто бесит.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|