Вход
Наше всё
Теги
codebook
PARTS
Поиск
Опросы
Закон
Четверг
21 января
О смысле всего сущего
0xFF
Средства и методы разработки
Мобильная и беспроводная связь
Блошиный рынок
Объявления
Микроконтроллеры
ARM
AVR
PIC
PLD, FPGA, DSP
Кибернетика
Технологии
Схемы, платы, компоненты
Микроконтроллеры
/1046513
Топик полностью
fk0
(23.10.2020 15:52, просмотров: 94)
в ответ на
Как-то сложно для микроконтроллеров. Легче вдуплить все таймеры в массив, в прерывании отнять 1 от значения каждого софт-таймера и если ноль вызвать калбек функцию (при её наличии)
- автор:
Boвa
Да ничего сложного, у меня на PIC18 работало. Попозже код напишу. Вот куча (очередь) -- сложно и не знаю как тут проще (если таймеров 100 штук).
[ZX]
Ответить
Ответы
Да в принципе можно и так как вы пишите, но вместо односвязного списка - очередь упорядоченная по оставшемуся времени. Сортировка по времени происходит в момент добавления события. В момент обработки события событие выбрасывается, и головой очереди становится следующее.
НО
если нужно сформировать какую-то циклическую последовательной действий очень все это не красиво будет.
-
Boвa
(
23.10.2020 16:02
)
Проблема линейной очереди -- гигантское время вставки если в очереди 6144 таймеров, например. Кроме того API прикладного уровня может иметь, например, функцию остановки/отмены запущенного таймера. Т.е. нужны операции: 1) вставки в очередь, 2) извлечение из головы очереди, 3) удаление произвольного элемента. Бинарная куча выглядит диковато и перетряхивает вообще всю память, но у ней худшее время понятно. Есть вариант со скип-листами, но там удалить физически нельзя, только
fk0
(427 знаков,
23.10.2020 20:49
,
ссылка
)
Есть замечательная статья, расписывающая возможные подходы к организации списка таймеров
-
lloyd
(
23.10.2020 21:10
,
ссылка
)
"Simple Timing Wheels" -- это какой-то испорченный пересказ на тему bucket queue. Для которых известно, что они хорошо работают когда там распределение равномерное и/или число приоритетов -- небольшое. В нашем случае числа большие (32-битное время, например) и распределение явно не равномерное, все таймеры могут свалиться в один bucket. "Since there may be many timers in any given slot, we maintain an ordered list of timers for each slot..." -- и здесь мы возвращаемся к
fk0
(1897 знаков,
23.10.2020 22:28
,
ссылка
)
Заводить 64К софтварных таймеров это новые
вершины
Эвересты
говнокода. Я так не умею, увы.
-
Boвa
(
23.10.2020 21:06
)
В этом и важное свойство библиотечных функций или функций ядра ОС, что они не знают, что там у тебя. И способны работать и в таких ситуациях. А для себя ты можешь сказать "мне в проекте достаточно 10 таймеров". А ядро ОС или библиотека не могут так сказать.
-
fk0
(
23.10.2020 21:10
)
Эта тема немного про другое.
(См. старттопик.)
-
Boвa
(
23.10.2020 21:15
)