嵌入式RTOS停止系统

时间:2018-01-19 16:45:50

标签: c embedded rtos freertos

我在Cortex M0上学习FreeRTOS。 (同时,我也在学习Cortex ......)。我有8位MCU的丰富经验。

我正在浏览FreeRTOS上的新手教程,我理解设置基本任务和空闲守护进程。

我意识到我并不真正了解FreeRTOS正在做些什么来管理内核的基础时序机制。这导致了一个大问题......

当您想要关闭设备时,关闭RTOS的理想方法是什么?没有闲置设备,但是你的MCU进入了最深的OFF(无论你想叫它)。

在任务之间空闲,但关闭MCU并确保它保持关闭似乎微不足道,并且RTOS内核不会触发中断或其他任何其他方式唤醒MCU备份......?

1 个答案:

答案 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   当满足以下条件时:

     
      
  1. 未使用软件定时器,因此调度程序不会在将来的任何时间执行定时器回调函数。

  2.   
  3. 所有应用程序任务处于Suspended状态,或者处于Blocked状态且具有无限超时(超时值为   portMAX_DELAY),因此调度程序不会将任务转移出去   在未来的任何固定时间阻止国家。

  4.         

    为了避免竞争条件,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时出现了一些问题......