首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式实时操作系统停止系统

嵌入式实时操作系统停止系统
EN

Stack Overflow用户
提问于 2018-01-19 16:45:50
回答 1查看 880关注 0票数 4

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

我正在学习有关FreeRTOS的新手教程,并且了解设置基本任务和空闲守护进程。

我意识到我并不真正理解FreeRTOS正在做什么来管理内核的底层计时机制。这就引出了一个大问题。

当你想关闭你的设备时,关闭实时操作系统的理想方法是什么?不要把设备闲置,而是把你的MCU放到最深邃的地方(不管你怎么称呼它)。

在任务之间空闲似乎很琐碎,但是关闭MCU并确保它保持不动,而RTOS内核不会触发中断或其他什么东西来唤醒MCU备份.?

EN

回答 1

Stack Overflow用户

发布于 2018-01-19 19:12:18

这是深度睡眠模式/断电模式,对于8位单片机来说,这是在ATmega128RFA1的数据表中,在Datasheet.pdf中的第159页ff中(有唤醒源),在这种模式下,所有内部计时器都被禁用。

在freeRTOS中,这被称为无痒空闲模式( cf https://www.freertos.org/low-power-tickless-rtos.html )

注意:如果eTaskConfirmSleepModeStatus()在从portSUPPRESS_TICKS_AND_SLEEP()内部调用它时返回eNoTasksWaitingTimeout,那么微控制器可以无限期地处于深度睡眠状态。只有在下列条件为真时,eTaskConfirmSleepModeStatus()才会返回eNoTasksWaitingTimeout:

  1. 没有使用软件定时器,因此调度程序不会在将来的任何时候执行计时器回调函数。
  2. 所有应用程序任务要么处于挂起状态,要么处于具有无限超时(超时值为portMAX_DELAY)的阻塞状态,因此调度程序不会在将来的任何固定时间将任务从阻塞状态转换出来。

为了避免竞争条件,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 MCU的低功耗特性页面上提供。

因此,在freeRTOS中,调用无痒空闲模式相当于深度睡眠或停电。可能你得手动关闭皮层的内部定时器..。

在Contiki操作系统下,ATmega128RFA1单片机在电源上出现了一些问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48345800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档