Tickless 模式 当 FreeRTOS 检测到所有任务均处于阻塞状态时,会进入 Tickless
模式,暂停系统节拍(SysTick)中断,并预测下一个任务唤醒时间,在此期间让 CPU
进入低功耗状态。此时,需要调用硬件相关的低功耗指令(如
WFI/WFE),但具体进入哪种硬件低功耗模式(如睡眠、停止)取决于底层实现。官方源码的是进入睡眠模式。如果要进入其他模式,更加节能,需要修改底层代码,这个是可能存在冲突的,不要瞎改。如果想要更加节能,可以在下面两个函数中关闭更多没用到的外设,这样更安全。
#define configPRE_SLEEP_PROCESSING(x) PRE_SLEEP_PROCESSING() /* 定义在进入低功耗模式前执行的函数 /
#define configPOST_SLEEP_PROCESSING(x) POST_SLEEP_PROCESSING() / 定义在退出低功耗模式后执行的函数 */
这段的描述对吗?
理解非常正确!FreeRTOS 的 Tickless 低功耗模式与 STM32 硬件低功耗模式的结合需要谨慎处理,直接修改底层代码进入更深层次的低功耗模式(如停止模式)可能存在风险,而通过 configPRE_SLEEP_PROCESSING 和 configPOST_SLEEP_PROCESSING 宏来管理外设的关闭与恢复,是一个更安全且推荐的做法。以下是详细解释和示例:
Tickless 模式的核心逻辑
-
触发条件
- 当 FreeRTOS 检测到所有任务均处于阻塞状态(即没有任务需要立即运行),且预测的空闲时间超过
configEXPECTED_IDLE_TIME_BEFORE_SLEEP(单位:tick)时,触发 Tickless 模式。 - 暂停 SysTick 中断,避免周期性的节拍中断唤醒 CPU。
- 当 FreeRTOS 检测到所有任务均处于阻塞状态(即没有任务需要立即运行),且预测的空闲时间超过
-
硬件低功耗的实现
- FreeRTOS 的默认实现(如
vPortSuppressTicksAndSleep)通常会让 CPU 进入 睡眠模式(Sleep Mode),通过WFI(等待中断)或WFE(等待事件)指令让 CPU 暂停运行。 - 睡眠模式仅关闭 CPU 时钟,外设时钟保持运行,功耗降低有限。若需更低功耗(如进入停止模式),需修改底层代码,但需注意硬件兼容性。
- FreeRTOS 的默认实现(如
-
关键问题
- 冲突风险:如果直接修改代码让 FreeRTOS 进入停止模式(Stop Mode),需处理以下问题:
- 时钟恢复:停止模式会关闭主时钟(如 HSE/HSI),唤醒后需重新初始化时钟(例如切回 PLL)。
- 外设状态:某些外设在停止模式下会丢失配置,需在唤醒后重新初始化。
- 唤醒时间误差:停止模式的唤醒延迟可能影响 FreeRTOS 的任务调度精度。
- 安全替代方案:优先通过
configPRE_SLEEP_PROCESSING和configPOST_SLEEP_PROCESSING关闭不必要的外设,无需修改 FreeRTOS 内核代码,风险更低。
- 冲突风险:如果直接修改代码让 FreeRTOS 进入停止模式(Stop Mode),需处理以下问题:
如何安全降低功耗:configPRE/POST_SLEEP_PROCESSING
FreeRTOS 提供了两个宏定义,允许用户在进入低功耗前关闭外设,唤醒后重新初始化。这是最安全的扩展方式,无需修改底层代码。
1. 配置宏定义
在 FreeRTOSConfig.h 中定义以下宏:

最低0.47元/天 解锁文章
1235

被折叠的 条评论
为什么被折叠?



