本系列文章预计共4篇,介绍和分析zephyr电源管理的框架和实现代码。本篇是第一篇简要介绍zephyr电源管理框架。
Zephyr RTOS电源管理子系统为系统集成商提供了几种实现电源管理支持的方法,利用这些方法可以在不同的级别上实现SOC节能。Zephyr对电源管理进行了很好的抽象使得其电源管理API可以匹配于不同的SOC体系结构,以相同的接口向应用程序和OS提供电源管理能力。
分类
Zephyr电源管理可分为3类
- Tickless Idle
- 系统电源管理(System Power Management)
- 设备电源管理(Device Power Management)
Tickless Idle
当所有thread都处于等待状态下, idle thread以下一次调度时间设置唤醒timer,并让CPU进入idle状态,当下一次调度时间到来时timer中断产生唤醒idle。以此达到省电的目的。
系统电源管理
在系统电源管理下,zephyr将电源状态分为下面几大类
- 激活状态(Active State) : 系统正常运行,CPU和外设都处于上电状态
- 睡眠状态(Sleep State):CPU Idle,内存保留上下文,一些时钟被关闭,SOC外设配置被保留,唤醒时可恢复上下文
- 深度睡眠状态(Deep Sleep State): CPU掉电,丢失上下文,关闭大多数SOC外设电源(依赖SOC), RAM只有特定区域数据被保存,唤醒时需要重走启动流程
系统级电源管理下,需要有应用程序负责设置唤醒事件,唤醒事件一般是SOC外设中断例如 SysTick, RTC, counter, or GPIO. 具体是那些外设不同的SOC有不同的设计。
系统电源管理有以下3种策略
- Residency: 针对不同的睡眠状态设定不同的最小保留期,当idle thread以当前到下一次调度时间匹配睡眠状态的保留期,选择进入不同的睡眠状态
- Application:完全由应用决定何时进入何种睡眠状态
- Dummy:多个睡眠状态依次循环,一般只用于测试
设备电源管理
Zephyr的device模型定义了电源管理接口,可以通过这些接口控制设备的电源状态,zephyr只提供设备电源管理框架,设备的电源管理实际实现是在device驱动内。
Zephyr设备电源管理框架提供两种方式
- 分布式: 应用程序或者组件直接和设备打交道,直接控制设备进入省电状态或者被唤醒
- 集中式:交由zephyr idle thread管理,在进入系统深度睡眠时会让设备也进入省电模式
Zephyr设备电源状态有4种
- DEVICE_PM_ACTIVE_STATE: 设备激活正常运行
- DEVICE_PM_LOW_POWER_STATE:设备上下文由硬件保留,不需要由驱动恢复
- DEVICE_PM_SUSPEND_STATE:大多数设备上下文都丢失,需由设备驱动恢复上下文,或者重新初始化设备
- DEVICE_PM_OFF_STATE:设备掉电,需要重新初始化设备
Zephyr提供2种设备电源管理操作
- DEVICE_PM_SET_POWER_STATE
- DEVICE_PM_GET_POWER_STATE
如果要一个外设驱动支持设备电源管理,需要定义设备支持的电源状态,电源状态之间的转换以及设备进行电源状态之间转换所需的必要操作。目前zephyr所实现的驱动并没有良好的支援所有设备驱动。比较完善的只有nrf系列
代码路径
电源管理的代码主要集中在zephyr/subsys/power和zephyr/kernel/idle.c,另外就是各设备驱动及各soc相关的idle代码
参考
http://docs.zephyrproject.org/latest/reference/power_management/index.html