真实面经题目 · 原创解析
FreeRTOS 低功耗是怎么做的,进入低功耗模式后如何唤醒?
这题考实时系统低功耗设计,回答要讲清 tickless idle、进入睡眠前判断、外部唤醒源和唤醒后的 tick/外设恢复。
真实面经题目 · 原创解析
这题考实时系统低功耗设计,回答要讲清 tickless idle、进入睡眠前判断、外部唤醒源和唤醒后的 tick/外设恢复。
FreeRTOS 低功耗常见思路是 tickless idle:当调度器发现一段时间内没有就绪任务,且下一个超时点还比较远,就停止周期 tick,计算可睡眠时间,然后由 portSUPPRESS_TICKS_AND_SLEEP 进入 MCU 的 sleep/stop 等低功耗模式。进入前要确认没有临界任务、DMA、外设传输或锁阻止睡眠,并配置 RTC、低功耗定时器、外部中断、通信外设等唤醒源。唤醒后可能来自定时器到期,也可能来自外部中断;系统要恢复时钟、外设和 SysTick,并根据实际睡眠时间补偿内核 tick,让延时和超时仍然正确。更深的低功耗模式省电更多,但恢复更慢,可能丢失 SRAM 或外设状态,所以要按功耗、唤醒延迟和状态保持能力选模式。
当没有任务可运行时,系统会进入 idle。若预计空闲时间足够长,周期 tick 继续运行反而浪费电,tickless 机制会临时关闭或重编程 tick。
进入低功耗前要检查是否有禁止睡眠的锁、未完成外设传输、临界时序任务、调试状态和最短可睡眠时间。否则可能为了省电破坏业务实时性。
常见唤醒源包括 RTC、低功耗定时器、GPIO 外部中断、通信接收、中断控制器事件等。不同低功耗模式保留的唤醒源不同,不能假设所有外设都能唤醒。
唤醒后需要恢复主时钟、PLL、外设时钟、tick 定时器,并根据睡眠时长推进内核 tick。深睡后还可能需要重新初始化外设或恢复上下文。
更深模式功耗低但唤醒慢、状态保持少;浅睡唤醒快但省电有限。设计时要结合最大允许响应时间和电池预算。
周期 SysTick 会频繁唤醒 CPU,导致无法长时间睡眠;tickless 会用可唤醒定时器保持下一次调度时间。
中断先唤醒 CPU 并执行 ISR,ISR 可以释放信号量或任务通知,使相关任务变为就绪,退出中断后触发调度。
要看最坏响应时间、任务优先级、栈水位、队列积压、临界区时长和中断延迟,用压力用例和日志证明正常路径、阻塞路径、异常恢复路径都在预算内。