148、Zephyr RTOS电源管理基础:系统电源状态管理
Zephyr RTOS电源管理基础:系统电源状态管理去年做一款电池供电的工业传感器节点,凌晨三点被测试同事的电话吵醒——设备在低功耗模式下每隔两小时就死机一次,看门狗都救不回来。连夜抓日志发现,问题出在系统从深度睡眠唤醒后,某个外设的时钟门控没有正确恢复。那次之后我花了整整一周把Zephyr的电源管理框架从头到尾捋了一遍,今天把这些踩过的坑整理出来。从一次死锁说起那个传感器节点用的是nRF52840,Zephyr 2.7版本。代码里调用了pm_state_force()强制进入深度睡眠,结果唤醒后SPI总线一直挂死。查了半天发现,PM状态切换时,系统默认只保存和恢复了CPU寄存器和RAM,但没处理外设的时钟域。后来在pm_state_exit_post_ops()里手动恢复了SPI的时钟使能,问题才解决。Zephyr的电源管理不是简单的“睡过去再醒过来”,它有一套完整的状态机,每个状态对应不同的功耗等级和恢复代价。理解这套机制,是做好低功耗设计的前提。电源状态模型:别被文档绕晕Zephyr定义了四个标准电源状态,但实际芯片厂商会扩展自己的状态。拿最常见的ARM Cortex-M系列来说:PM_STATE_ACTIVE:全速运行,所有时钟和电源域都开着。这时候谈功耗管理就是扯淡,但很多新手上来就想进睡眠,忽略了ACTIVE状态下的动态调频。PM_STATE_SUSPEND_TO_IDLE