Zephyr RTOS内核基础:功耗管理之动态频率调整
从一块发热的板子说起
去年做的一个工业网关项目,现场反馈设备外壳烫手。拆开一看,STM32H743跑在400MHz,CPU负载常年不到15%。客户要求整机功耗控制在2W以内,这CPU自己就干掉了将近0.8W。典型的“杀鸡用牛刀”——频率拉满,大部分时间却在空转。
当时第一反应是上睡眠模式,但问题在于这个设备需要实时响应Modbus TCP请求,睡眠唤醒的延迟不可接受。后来翻Zephyr的PM子系统,发现动态频率调整(Dynamic Frequency Scaling,DFS)才是正解——让CPU在低负载时降频跑,有突发请求时瞬间拉满,既保响应又降功耗。
动态频率调整不是什么黑科技
说白了就是根据CPU利用率动态切换时钟频率和电压。Zephyr里这套机制叫CONFIG_PM_DEVICE和CONFIG_PM_CPU_FREQ,底层依赖SoC的时钟树配置。以STM32为例,本质就是操作PLL的分频系数和倍频系数,或者直接切到HSI/HSE。
但别以为只是改个寄存器这么简单。频率切换时,外设时钟可能跟着变,定时器、UART波特率、ADC采样率全都会受影响。我第一个版本直接在中断里切频率,结果UART乱码、定时器跑飞,现场调试差点把示波器砸了。
Zephyr的DFS实现架构
Zephyr把频率管理抽象成两层:
策略层(Policy)