Спасибо. Любопытно. Есть моменты для обсуждения. Событийная система в кооперативном варианте Quantum Leaps проложена, но приоритетов не видел. У меня самописное кооперативное аналогичное есть для мелкожрательности (и не только) с флагами. В связи с мелкожрательностью задачи подписываются на события (выставляют флаги в дескрипторе задачи), задают желаемый уровень энергопотребления (тоже в дескрипторе задачи), и делают yield(), менеджер питания проверяет, нет ли необработанных ожидающих флагов, которые возникают большей частью в обработчиках прерываний (механизм отложенной обработки прерываний в фоне) и на которые подписались, далее при отсутствии необработанных флагов и заказанном уровне энергопотребления (аукцион между уровнями потребления в дескрипторах обслуживаемых задач) укладывает систему в спячку с разрешенными прерываниями. Наличие необработанных флагов пробуждает (или не дает заснуть) эту шнягу, а далее специальный мониторчик копирует
raw-набор флагов событий, оббегает все дескрипторы и ставит флаг активности задачам, подписанным на набор событий в копии. После этого запускаются только активные задачи а-ля укороченный биглуп. Тут есть тонкость - дескрипторы неактивных задач тоже просматриваются, флаги и уровни потребления принимают участие в работе менеджера питания. Параллельно с этой системой событий работает голландский аукцион "времен регулярной побудки" и заряжаются значения в таймер (time-triggered системы), от которого тоже есть флаг события (для поллинга таймаутов) - неточно, зато дешево и практично:)
О приоритетах событий у меня думают приложения - внешний решатель-запускатель не может изменять список дескрипторов. Пока не может, но я подумаю - вдруг в каких-нибудь сценариях использования мне это понадобится, тогда заделаю.
Пока это работало на MSP430 (начиная со 128 байт ОЗУ и 1 кБ флеш), AVR (m128, m2560) и на Corteх-M0, 0+, 3, 4. Минимально - переписывается монитор питания и таймер.
Доставляют короткие LP-таймеры с countdown:)
В MSP был модуль перекалибровки низкочастотного RC-генератора по высокочастотному и длинный счетчик с разрешением 1 мкс - нужно было интервалы порядком 20 часов довольно точно отсчитывать, а часовой кварц в одном случае, некуда подключать, в другом забажен генератор...
В STM32L476 пришлось рожать переключение тактовой частоты (и генераторов) на ходу (USB любит 48 МГц, LWIP-у у меня достаточно 16 MHz, всё остальное делается на 4 МГц, или нафиг спим) - ещё тот секас. Был объемный пласт написанного прикладного ПО (благо было сделано на этой платформе, но сначала без использования собственно управления потреблением) и пришлось лечить неинвазивно:) - не переписывать прототипы функций задержек, а сделать функции задержек независимыми от тактовой..., в разных масштабах шкал... Аккуратный инит/деинит USB на ходу был камнем преткновения - если бы не осилил, то всё остальное было бы ненужно...
-
- Спасибо! Одни идеи уже немало дают. Dingo(156 знак., 18.10.2019 17:24 - 17:35)