
Разгорелась целая дискуссия по поводу оптимальности как подхода в целом,
так и конкретных реализаций. Есть много здравых мыслей. Я, в свою
очередь, не претендую на оптимальность своего решения (порой бывает
избыточной такая конструкция), но получилось достаточно удобно и когда
надо быстро скреативить прошивку, да так чтобы отлаживать не пришлось
почти, то эта конвеерная молотилка как нельзя кстати приходится. Плюс тут
очень многое поддается оптимизации. Можно сделать очередь на указателях
в виде кольцевого буфера, можно оптимизировать таймер. Например, сделав
его статичным.
В ассемлерных программах у меня тоже используется похожая структура.
Правда переход идет не по реальным адресам, а по индексам в таблице
переходов. Впрочем, в ранних постах я эту систему подробно описывал, и
все последующие примеры кода были уже на ней.
Файл с примером кода на диспетчере
AVR. Учебный курс. Архитектура Программ. Часть 3
Приоритетный диспетчер.
Одной из проблем простого диспетчера является то, что все задачи имеют
равный приоритет. С одной стороны, это просто и удобно. С другой — какое-
либо важное событие можно прошляпить, пока там конвейер перещёлкает
все задачи…
Проблему решает введение приоритетов.
В простейшем случае, можно ввести два приоритета — высокий и низкий.
Разница между ними будет лишь в том с какой стороны очереди они будут
засовываться на конвейер. Высокоприоритетные пихаются сразу в начало,
низкоприоритетные с конца.
Разумеется, тут надо следить за тем, чтобы высокоприоритетные задачи не