Нежданно-негаданно нарисовалось устройство с требованием минимального потребления. Используется контроллер STM32L0xx. Это Cortex-M0+, специально заточен на это дело.
Проблема в том, что я довольно смутно представляю, как подойти к проблеме. К примеру, у меня есть несколько процессов:
- Процесс периодического чтения данных с внешнего АЦП (через SPI);
- Процесс обсчёта результатов измерения;
- Процесс обмена данными по USART (с использованием DMA);
- Процесс записи накопленных данных в Dataflash (через SPI).
И вот, надо все эти процессы прекратить и уснуть до заданного времени.
Я пока не совсем понимаю, как это сделать. После некоторых раздумий имею вот такой план:
- Захватываю выполнение в самом приоритетном процессе;
- Взвожу какой-то флаг "ПораВсемСпать";
- Жду от всех процессов подтверждения готовности ко сну;
- Отключаю всю оставшуюся периферию. (Процессы свою периферию отключают сами);
- Засыпаю.
Непонятные моменты в таком подходе:
- Какого вида должен быть флаг "ПораВсемСпать"? (Вот тут не хватает аналога виндового MsgWaitForMultipleObjects()).
- Если процесс повис на ожидании какого-то объекта синхронизации, то как он получит мой флаг?
- Как получать подтверждения от процессов? Очередь сообщений?
Ещё возможен вариант просто вырубить всю периферию самостоятельно, плюнув на текущую деятельность процессов. (Как тогда вырубить DMA?)
В этом случае неясно, что делать со всем этим после пробуждения. Тайм-ауты все испортились, периферию надо заново всю инициализировать, и так далее.
Возможно, тут поможет механизм перезапуска процессов? Или уж просто сделать сброс?
В общем, коллеги, прошу всех поделиться своими соображениями по данному вопросу.