Contents
计算机系统的运行是依靠电能运行的,而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就会大大提升该系统的生存竞争力。这方面,大自然已经做的很好了,如植物的落叶,如动物的冬眠,等等。而在计算机的世界里(这里以运行Linux OS的嵌入式系统为例),称作电源管理(Power Management)。
电源管理(Power Management)在Linux Kernel中,是一个比较庞大的子系统,涉及到供电(Power Supply)、充电(Charger)、时钟(Clock)、频率(Frequency)、电压(Voltage)、睡眠/唤醒(Suspend/Resume)等方方面面。
对于嵌入式设备而言,功耗管控能力是设备性能表现的重要依据。而嵌入式开发中电源功耗管控主要由驱动控制。
RPM框架
RPM(Runtime power management)在Linux内核驱动中,是一套运行时电源管理框架,为系统中所有的device提供了一种运行时电源管理的机制。这也是新内核(linux 2.6以后)展现的新特性:模块化处理,实现高内聚和低耦合。通俗地讲呢,就是“各人自扫门前雪”,尽量扫好自己的(高内聚),尽量不和别人交互(低耦合)。而RPM正体现了这一思想:每个设备(包括CPU)都处理好自身的电源管理工作,尽量以最低的能耗完成交代的任务,尽量在不需要工作的时候进入低功耗状态,尽量不和其它模块有过多耦合。每个设备都是最节省的话,整个系统一定是最节省的。
RPM的软件设计框架如下图所示:

为什么需要Runtime PM Framework?
- 改变设备的电源状态需要整个平台的支持。
- 当设备处于低功耗模式时,wakeup signal常常需要platform或者bus的支持。
- 设备驱动不知道什么时候去suspend设备的,也就是驱动是没法判断设备是否处于idle状态,通常需要依赖subsystem,比如bus。
- pm相关的操作都需要顺序执行,这时候就免不了使用workqueue。
- Runtime PM需要和system-wide suspend需要保持兼容。比如system-wide suspend的时候设备已经处于Runtime PM的SUSPENDED状态了,这时候应该怎么处理此设备?
以上这些工作都需要Runtime PM framework的支持,这也都是Runtime PM framework应该操心的事情。
Runtime PM数据结构
为了实现设备的runtime pm,需要subsystem(PM domains、device types、classes and bus types)和driver提供下面三个回调函数:
//内核驱动中使用的电源管理数据结构
struct dev_pm_ops {
....
int (*runtime_suspend)(struct device *dev);
int (*runtime_resume)(struct device *dev);
int (*runtime_idle)(struct device *dev);
};
三个回调函数分别用于suspend device,resume device和idle device。通常Runtime PM framework会在合适的时机调用三个函数。
Runtime PM运行机制
核心机制
RPM的核心机制是这样的:
- 为每个设备维护一个引用计数(device->power.usage_count),用于指示该设备的使用状态。
- 当需要使用设备时,device driver调用pm_runtime_get(或pm_runtime_get_sync)接口,增加引用计数;不再使用设备时,device driver调用pm_runtime_put(或pm_runtime_put_sync),减少引用计数。每一次put,RPM core都会判断引用计数的值。如果为零,表示该设备不在使用(Idle)了,则使用异步(ASYNC)或同步(SYNC),调用设备的.runtime_idle回调函数。
- .runtime_idle的存在,是为了在idle和suspend之间加一个缓冲,避免频繁的suspend/resume操作。因此它的职责是:判断设备是否具备suspend的条件,如果具备,在合适的时机,suspend设备。、
可以不提供,RPM core会使用异步(ASYNC)或同步(SYNC)的方式,调用设备的.runtime_suspend回调函数,suspend设备,同时记录设备的PM状态;
可以调用RPM core提供helper函数(pm_runtime_autosuspend_expiration、pm_runtime_autosuspend、pm_request_autosuspend),要求在指定的时间后,suspend设备。
- pm_runtime_autosuspend、pm_request_autosuspend等接口,会起一个timer,并在timer到期后,使用异步(ASYNC)或同步(SYNC)的方式,调用设备的.runtime_suspend回调函数,suspend设备,同时记录设备的PM状态。
- 每一次get,RPM core都会判断设备的PM状态,如

Runtime Power Management (RPM)是Linux内核中的一种电源管理机制,旨在减少设备在运行时的功耗。RPM通过设备的引用计数管理设备状态,当设备闲置时自动进入低功耗模式。它包括异步和同步操作,以及对级联设备的管理。设备驱动通过`pm_runtime_get`和`pm_runtime_put`接口在需要时获取和释放设备资源,从而触发设备的激活和挂起。RPM框架处理设备间同步问题,确保电源管理操作的有序进行。
最低0.47元/天 解锁文章
1502

被折叠的 条评论
为什么被折叠?



