ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
1046507 Топик полностью
fk0, легенда (23.10.2020 15:43 - 15:51, просмотров: 912) ответил Peter_M на Подскажите как сейчас правильно организовать в микроконтроллере программные таймеры?
Нужна очередь с приоритетом (priority queue), реализуется на двоичной куче... Если таймеров буквально меньше десятка, то просто односвязный список. В списке хранится абсолютное время (относительно некой точки отсчёта, не важно какой), после которого таймер должен сработать. Логика работы такая: 

1) есть аппаратный таймер, который можно запрограммировать на срабатывание в определённый момент времени (через заданный интервал);


2) есть функция получения времени, которая может вычитать значение аппаратного таймера, сложить с значением переменной в памяти (см. ниже) и получить время в условных единицах (не важно каких, не обязательно миллисекунда) относительно момента старта прибора, например;


3) в прерываниях (при его переполнении) от аппаратного таймера увеличивается переменная в памяти на значение установленного сейчас периода срабатывания таймера -- таким образом сумма текущего значения таймера и данной переменной даёт текущее время;


4) переменная хранящая текущее время может переполняться за какой-то разумный интервал, много больший, чем любые интервалы времени с которыми оперирует прибор (например, раз в несколько суток);


5) программные таймеры, как сказано выше, в простейшем случае хранятся в списке/очереди в порядке срабатывания: при добавлении очередного, он встраивается в нужное место списка/очереди;


6) потом программно обрабатывается только самый первый элемент очереди: вычисляется время до его срабатывания, и если оно больше полного периода аппаратного таймера -- ничего не делается до следующего прерывания от таймера (потом перерасчёт повторяется), если меньше -- аппаратный таймер программируется на меньший интервал...


7) в прерывании от аппаратного таймера вычисляется текущее время (функция из пункта 2) и если оно больше абсолютнго времени записанного в первом в очереди программном таймере, но при этом разница менее половины интервала за который происходит переполнение (пункт 4), то запускается обработчик события программного таймера. Иначе (более половины интервала переполнения, или отрицательное, если со знаком) -- время ещё не подошло, очевидно... После срабатывания программного таймера он, если однократный, исключается из очереди, если многократный -- перемещается на нужное место в очереди.


Как-то так.


https://ru.wikipedia.org/wiki/%D0%9E%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D1%8C_%D1%81_%D0%BF%D1%80%D0%B8%D0%BE%D1%80%D0%B8%D1%82%D0%B5%D1%82%D0%BE%D0%BC_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

[ZX]