Встроенная система остановки RTOS
Я изучаю FreeRTOS на Cortex M0. (Одновременно я также изучаю кортекс...). У меня большой опыт работы с 8-битными микроконтроллерами.
Я прохожу учебные пособия для новичков по FreeRTOS и понимаю, как настраивать базовые задачи и демон бездействия.
Я понимаю, что не совсем понимаю, что делает FreeRTOS для управления механизмами синхронизации ядра. Что приводит к одному большому вопросу...
Каков идеальный способ выключить ОСРВ, если вы хотите выключить свое устройство? Не отключайте устройство, а поместите MCU в самое глубокое состояние OFF (как вы хотите это называть).
Кажется тривиальным, простаивать между задачами, но отключить MCU и убедиться, что он выключен, а ядро RTOS не вызывает прерывание или что-то еще, чтобы разбудить MCU...?
1 ответ
Это режим глубокого сна / режим выключения питания, для 8-битного MCU это находится в спецификации ATmega128RFA1 на стр. 159 в http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8266-MCU_Wireless-ATmega128RFA1_Datasheet.pdf (с источниками пробуждения) в этом режиме все внутренние таймеры отключены
в freeRTOS этот режим называется режимом без тика, cf https://www.freertos.org/low-power-tickless-rtos.html
Примечание: если eTaskConfirmSleepModeStatus() возвращает eNoTasksWaitingTimeout, когда он вызывается из portSUPPRESS_TICKS_AND_SLEEP(), то микроконтроллер может оставаться в состоянии глубокого сна бесконечно долго. eTaskConfirmSleepModeStatus() будет возвращать eNoTasksWaitingTimeout только тогда, когда выполняются следующие условия:
Программные таймеры не используются, поэтому планировщик не должен выполнять функцию обратного вызова таймера в любое время в будущем.
Все задачи приложения находятся либо в состоянии Suspended, либо в состоянии Blocked с бесконечным тайм-аутом (значение тайм-аута portMAX_DELAY), поэтому планировщик не должен переводить задачу из состояния Blocked в любое фиксированное время в будущем.,
Чтобы избежать условий гонки, планировщик RTOS приостанавливается перед вызовом portSUPPRESS_TICKS_AND_SLEEP() и возобновляется после завершения portSUPPRESS_TICKS_AND_SLEEP(). Это гарантирует, что прикладные задачи не могут выполняться между микроконтроллером, выходящим из его состояния низкого энергопотребления, и portSUPPRESS_TICKS_AND_SLEEP(), завершающим его выполнение. Кроме того, для функции portSUPPRESS_TICKS_AND_SLEEP() необходимо создать небольшой критический участок между остановленным источником тиков и микроконтроллером, переходящим в состояние ожидания. eTaskConfirmSleepModeStatus() должен вызываться из этого критического раздела.
Все порты GCC, IAR и Keil ARM Cortex-M3 и ARM Cortex-M4 теперь предоставляют реализацию по умолчанию portSUPPRESS_TICKS_AND_SLEEP(). Важная информация об использовании реализации ARM Cortex-M представлена на странице "Функции с низким энергопотреблением для микроконтроллеров ARM Cortex-M".
поэтому в freeRTOS запуск режима без галочки эквивалентен глубокому сну или отключению питания. возможно, вам придется вручную отключить внутренние таймеры в коре...
были некоторые проблемы с отключением питания ATmega128RFA1 MCU в ОС Contiki...