Начал изучать FreeRTOS. Не могу понять вот что. Как правильно обработать прерывание? Вот, например, простенькая задача. Обрабатывать одну кнопку. Одинарное нажатие и двойное. Я вижу такое решение (без FreeRTOS): в прерывании, от нажатия кнопки я отсчитываю время, и если разница между срабатываниями меньше определенного - это двойной клик. Иначе - одинарный. Как подобное принципиально решается во FreeRTOS?
Комментарии: 9
Anton
Можно такое делать в отдельном потоке с высоким приоритетом. Ставится там delay, чтобы поток исполнялся с нужной частотой и в нем все опрашивается. Можно и в прерываниях как вы описали, но думаю оно сложнее.
Anonim
опять закручиваем саморезы молотком? я не понимаю, зачем решать с помощью rtos задачи которые решаются нормально ей? энкодер тоже на задачах rtos будем обрабатывать?
Aleksandr
Вот! Я хочу понять, как принципиально правильно это делать!
Anonim
обрабатывать в прерываниях, класть в уровень "hal", rtos проверять в задачах что там нам положили hal это не тот hal что от ST, это просто прокладка, класс, структура или просто переменная глобальная
Aleksandr
Опередили. Но разве глобальная переменная - это не есть плохо в модульном FreeRTOS?
Anonim
а иначе как?
Aleksandr
Не знаю, потому и спрашиваю.
Anonim
у тебя прерывание это уже hardware-specific уровень который делит модульность на ноль
Denis
ещё можно проклеить спец термоклеем клеем, сам не проверял но тест видел если кому интересно если прям хочется с прерываниями то используйте событие, в потоке первым делом ждете неограниченое время до возникновения события, потом ограниченое время если 2ое событие не сработало то одинарное нажатие, сработало - двойное в прерывании от кнопки генерируйте событие для ртоса тоже можно сделать на мьютексах и семаформах если кнопок больше 1ной и нужно ещё и длительное нажатие то обработка по прерыванию превращается в попоболь мое имхо опрашивать кнопки в потоке и от этого плясать