一次“越优化功耗越高”的翻车
先讲一个让我印象深刻的案例。
某款电池供电的无线传感器,主控是 STM32L4,需求是每 5 秒采集一次数据,其余时间休眠,电池要撑 2 年。硬件工程师选了一颗低功耗 MCU,软件工程师在 FreeRTOS 上开了 Tickless 模式。
按数据手册算,Stop 2 模式电流 1.1μA,采集时电流 5mA 持续 20ms。平均电流应该是:
(5mA × 20ms + 1.1μA × 4980ms) / 5000ms ≈ 20.1μA
电池 2000mAh,理论续航约 10 年。看起来绰绰有余。
结果样机做出来,实测平均电流 180μA。比预期高了 9 倍。
排查了两周,最后发现根因:Tickless 模式配置不当,系统每 100ms 就唤醒一次,而每次唤醒的开销(时钟恢复、外设初始化、任务调度)远远超过了休眠节省的功耗。
具体来说,configEXPECTED_IDLE_TIME_BEFORE_SLEEP 被设成了 2(2 个 Tick,即 2ms)。系统只要空闲超过 2ms 就进 Stop 模式。而 Stop 模式的进出开销——时钟稳定、Flash 唤醒、外设恢复——加起来大约 800μs。结果是:每 100ms 的休眠周期里,有 800μs 在进出低功耗,实际有效休眠只有 99.2ms。 进出开销的功耗摊到平均电流上,直接把待机电流从 1.1μA 拉到了 180μA。
Tickless 模式不是“开了就省电”。配置