FreeRTOS 的 Tickless 低功耗模式 是一种在系统空闲时暂停定时器中断(SysTick)的技术,允许微控制器(MCU)进入深度睡眠状态以降低功耗,直到下一个任务就绪或外部事件唤醒。此模式特别适用于电池供电的嵌入式设备。以下是 Tickless 模式的配置、核心 API 及实现原理的详细讲解。
Tickless 模式的核心原理
- 空闲时停用 SysTick
当系统进入空闲状态且无任务需要运行时,FreeRTOS 关闭 SysTick 中断,并根据下一个任务的唤醒时间计算 MCU 可睡眠的时长。 - 动态唤醒
使用低功耗定时器(如 RTC 或 LP Timer)在指定时间后唤醒 MCU,或依赖外部中断(如 GPIO、UART)提前唤醒。 - 时间补偿
睡眠期间跳过 SysTick 中断,通过硬件定时器记录实际睡眠时间,并在唤醒后修正系统时间。
Tickless 模式的配置
在 FreeRTOSConfig.h 中启用并配置以下宏:
| 宏定义 | 说明 |
|---|---|
configUSE_TICKLESS_IDLE |
设为 1 启用 Tickless 模式。 |
configEXPECTED_IDLE_TIME_BEFORE_SLEEP |
定义进入低功耗的最小空闲时间(单位:Tick)。若空闲时间小于此值,不进入睡眠。默认为 2。 |
configPRE_SLEEP_PROCESSING |
用户自定义的预睡眠处理函数(关闭外设、降低时钟等)。 |
configPOST_SLEEP_PROCESSING |
用户自定义的睡眠后恢复函数(恢复外设、时钟等)。 |
Tickless 模式的关键函数
1. 核心函数 portSUPPRESS_TICKS_AND_SLEEP()
- 功能:由 FreeRTOS 内核调用,用于进入低功耗状态并计算睡眠时间。
- 实现要求:需用户根据硬件平台实现此函数(通常位于
port.c或独立驱动文件中)。 - 函数原型:
void portSUPPRESS_TICKS_AND_SLEEP(TickType_t xExpectedIdleTime);xExpectedIdleTime:预计的空闲时间(单位:Tick),即下一个任务的等待时间。
2. 预睡眠处理 configPRE_SLEEP_PROCESSING
- 功能:在进入低功耗前关闭高功耗外设或调整系统时钟。
- 示例:
void vPreSleepProcessing(uint32_t ulExpectedIdleTime) { // 关闭ADC、串口等外设 HAL_ADC_Stop(&hadc);

最低0.47元/天 解锁文章
1092

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



