我在Cortex M0上学习FreeRTOS。 (同时,我也在学习Cortex ......)。我有8位MCU的丰富经验。
我正在浏览FreeRTOS上的新手教程,我理解设置基本任务和空闲守护进程。
我意识到我并不真正了解FreeRTOS正在做些什么来管理内核的基础时序机制。这导致了一个大问题......
当您想要关闭设备时,关闭RTOS的理想方法是什么?没有闲置设备,但是你的MCU进入了最深的OFF(无论你想叫它)。
在任务之间空闲,但关闭MCU并确保它保持关闭似乎微不足道,并且RTOS内核不会触发中断或其他任何其他方式唤醒MCU备份......?
答案 0 :(得分:3)
这是深度睡眠模式/掉电模式,对于8位MCU,这是在http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8266-MCU_Wireless-ATmega128RFA1_Datasheet.pdf的第159页的ATmega128RFA1的数据表中(带有唤醒源) )在此模式下,所有内部计时器都被禁用
在freeRTOS中这被命名为 Tickless Idle Mode ,cf https://www.freertos.org/low-power-tickless-rtos.html
注意:如果eTaskConfirmSleepModeStatus()返回eNoTasksWaitingTimeout 当从portSUPPRESS_TICKS_AND_SLEEP()内部调用它时 微控制器可以无限期地保持深度睡眠状态。 eTaskConfirmSleepModeStatus()只返回eNoTasksWaitingTimeout 当满足以下条件时:
未使用软件定时器,因此调度程序不会在将来的任何时间执行定时器回调函数。
- 醇>
所有应用程序任务处于Suspended状态,或者处于Blocked状态且具有无限超时(超时值为 portMAX_DELAY),因此调度程序不会将任务转移出去 在未来的任何固定时间阻止国家。
为了避免竞争条件,RTOS调度程序之前被暂停 调用portSUPPRESS_TICKS_AND_SLEEP(),并在恢复时恢复 portSUPPRESS_TICKS_AND_SLEEP()完成。这确保了应用 任务不能在微控制器退出其低功率之间执行 state和portSUPPRESS_TICKS_AND_SLEEP()完成执行。 此外,有必要使用portSUPPRESS_TICKS_AND_SLEEP() 函数在tick源之间创建一个小的关键部分 停止,微控制器进入睡眠状态。 应该从这个关键字调用eTaskConfirmSleepModeStatus() 部分。
现在所有GCC,IAR和Keil ARM Cortex-M3和ARM Cortex-M4端口 提供默认的portSUPPRESS_TICKS_AND_SLEEP()实现。 有关使用ARM Cortex-M实现的重要信息是 在ARM Cortex-M MCU的低功耗特性页面上提供。
所以在freeRTOS中调用无空闲空闲模式相当于深度睡眠或掉电。可能你必须手动禁用皮质上的内部计时器...
在Contiki OS中关闭ATmega128RFA1 MCU时出现了一些问题......