嵌入式Linux系统的动态电源管理技术(转)
如何有效地管理嵌入式系统,尤其是移动终端的电源功耗,是一个很有价值的课题。动态电源管理 DPM(Dynamic Power, Management)技术提供一种操作系统级别的电源管理能力,包含CPU工作频率和电压,外部总线时钟频率,外部设备时钟/电源等方面的动态调节、管 理功能。通过用户层制定策略与内核提供管理功能交互,实时调整电源参数而同时满足系统实时应用的需求,允许电源管理参数在短时间的空闲或任务运行在低电源 需求时,可以被频繁地、低延迟地调整,从而实现更精细、更智能的电源管理。
1 动态电源管理原理
CMOS电路的总功耗是活动功耗与静态功耗之和。当电路工作或逻辑状态转换时会产生活动功耗,未发生转换时晶体管漏电流会造成静态功耗:
![](http://linux.ccidnet.com/col/attachment/2007/4/1068835.jpg)
式中C为电容,fc为开关频率,Vdd为电源电压,IQ为漏电流。C·Vdd·fc为活动功耗;VddIQ为静态功耗。在操作系统级的电源管理设计实现中,重点是活动功耗。从中可以得出几种管理活动功耗的方法:
①电压/时钟调节。通过降低电压和时钟来减少活动功耗和静态功耗。
②时钟选通。停止电路时钟,即设fc为O,让Pactive为0。将时钟从不用的电路模块断开,减少活动功耗。许多CPU都有“闲置”或“停止”指令,一些处理器还可通过门控关闭非CPU时钟模块,如高速缓存、DMA外设等。
③电源供应选通。断开电路中不使用的模块电源供应。这种方法需要考虑重新恢复该模块的代价。
断开不使用的模块的时钟和电源供应可以减少电源消耗,但要能够正确预测硬件模块的空闲时期。因为重新使能硬件模块时钟和电源会造成一定延迟,不正确的预测将导致性能下降。
从式(1)可以看出:降低电压对功耗的贡献是2次方的;降低时钟也可降低功耗,但它同时也降低性能,延长同一任务的执行时间。设2.0 V高压下的能量消耗为E高=P高·T,则1.0 V低压下能量消耗为E低=P低·2T(实践中频率近似线性依赖电压),再根据式(1)容易得到P高=8P低。综合上式可以得出:E高=4E低,所以,选择 满足性能所需的最低时钟频率,在时钟频率和各种系统部件运行电压要求范围内,设定最低的电源电压,将会大量减少系统功耗。上例中完成任务所需的能量可以节 约75%。
2 硬件平台对动态电源管理的支持
通过调节电压、频率来减少系统活动功耗需要硬件支持。SoC系统一 般有多个执行单元,如PM(电源管理)模块、OSC(片上晶振)模块、PLL(锁相环)模块、CPU核以及CPU核中的数据缓存和指令缓存,其他模块统称 为外围模块(例如1,CD控制器、UART、SDRAM控制器等)。CPU高频时钟主要由PLL提供,同时PLL也为外围模块和SoC总线提供其他频率时 钟。一般SoC系统都有一些分频器和乘法器可以控制这些时钟。PM模块主要是管理系统的电源供应状态。一般有自己的低频、高准确度晶,振,用以维持一个 RTC时钟、RTC定时器和中断控制单元。其中中断控制单元使RTC定时器和外部设备能够唤醒挂起的SoC系统。下面以一个广泛用于手持设备的 TI0MAPl610处理器为例。
①时钟模块。OMAPl610提供一个数字相控锁环(DPLL),将外频或晶振输入转化为高频,供 给OMAP 3.2核以及其他片上设备。操作DPLL控制寄存器DPLLl_CTL_REG就可以设置DPLL输出时钟,辅以设置时钟复用寄存器(MUX)和时钟控制 寄存器ARM_CKCTL,就能控制MPU和DSP的运行频率,MPU、DSP外设时钟,以及LCD刷新时钟,TC_CK时钟(Trafflc Control Clock)等。
②电源管理模块。OMAPl610集成一个超低功耗控制模块(ULPD),用以控制OMAP3.2时钟和控制OMAPl610进出多种电源管理模式。操作ULPD控制寄存器ULPD_POWER_CTRL,可以设置处理器电压、管理运行模式。
3 嵌入式Linux动态电源管理软件实现
嵌入式Linux已被广泛应用在电源功耗敏感的嵌入式设备上,特别是移动手持设备;因此,设计高效、精细的电源管理技术是嵌入式Linux开发成功的关键技术之一。
3.1动态电源管理实现原理
系统运行在常见的几种不同状态,有不同电源级别要求,其中蕴涵着丰富的节能机会。状态转化如图1所示。
![](http://www.51x86.com/include/picture/500/400/data/10-01/16288618020159/1263824980_5b79ef96.jpg)
①系统运行在任务、任务一、任务+中的任务状态之一,可以响应中断进入中断处理,可以进入空闲或睡眠状态。不同的任务要求不同的电源级别,例如播放MP3可以降低处理器的频率,而运行在线互动游戏时则要求处理器全速运行,所以DPM需要在不同任务中提供电源管理服务。
②系统进入空闲,这时可以被中断唤醒,处理中断:DPM提供受管理的空闲模式,可以更智能地节省电源。
③系统在中断处理完可以进入空闲状态,或者从中断中回到任务态。
④系统在任务状态下可进入睡眠模式。系统可挂起到RAM或者其他存储器中,关闭外设,实现最大限度地省电。通过特定事件(例如定义UART中断)要求系统退出睡眠模式。
综上所述,可以把动态电源管理分为平台挂起/恢复、设备电源管理以及平台动态管理等三类。平台挂起/恢复目标在于管理较大的、非常见的重大电源状态改 变,用于减少产品设备在长时间的空闲之后,减少电源消耗。设备电源管理用于关断/恢复平台中的设备(平台挂起/恢复以及动态管理中均要用到);而平台动态 管理目标在于频繁发生、更高粒度的电源状态改变范围之内的管理。系统运行的任务可以细分为普通任务和功率受监控的任务。前者电源状态是 DPM_NO_STATE,不作电源管理;后者对功率敏感,在被调度时(参见图1)可以通过DPM来设置其电源管理状态,要求运行在不同的电源级别。本文 重点描述平台动态电源管理和设备电源管理两类,并将设备电源管理视为动态电源管理的组成部分。
3.2平台动态电源管理设计
在Linux架构下实现电源管理内核模块需要实现一个应用层和操作系统的接口,一个为多个硬件平台提供通用电源管理逻辑控制框架的硬件无关层,以及一个管理特定硬件电源控制接口的平台相关电源控制层。
3.2.1 内核模块控制模型
模型主要由操作点、管理类、管理策略等组成。
①用电源管理操作点对应平台硬件相关参数。例如,TIOMAPl610参考开发板有多个参数:CPU电压、DPLL频率控制(通过倍频器和分频器两个参 数)、CPU频率控制、TC交通控制器、外部设备控制、DSP运行频率、DSP的MMU单元频率和LCD刷新频率。如果使用TI的DSP代码,则后四个参 数为不可控,均使用默认值,如表1所列。
![](http://linux.ccidnet.com/col/attachment/2007/4/1068839.jpg)
其中,“192 MHz—1.5 V”操作点参数“1 500”表示OMAP3.2核心电压为1 500 mV;“16”表示DPLL频率控制12 MHz晶振输入16倍频;“1”表示分频为1;“1”表示OMAP3.2核心分频为1(所以它运行在192 MHz)“2”表示TC(交通控制器)分频为2(所以它运行在96 MHz).
②类:多个操作点组成一个管理类。
③策略:多个或一个类组成策略。
一般可以简化系统模型,直接将DPM策略映射到一个系统操作状态下特定的DPM操作点,如表2所列。复杂点系统可以考虑将DPM策略映射到一个多操作点的DPM管理类,再根据操作状态切换时选择管理类中满足约束的第一个操作点。
![](http://linux.ccidnet.com/col/attachment/2007/4/1068841.jpg)
表2中策略映射到四个操作点,分别对应“sleep”、 “idle”、“task-1”、“task”四种电源状态。除非用户加以改变,否则系统fork创建的任务默认运行在DPM-TASK-STATE状态,对应表2中task状态,其操作点为192 MHz-1.5 V。
通过这种结构,电源管理系统把系统创建的任务和具体的电源管理硬件单元参数连接起来,为任务间精细电源管理提供一个框架。
3.2.2内核功能实现
如图2所示,DPM软件实现可以分为应用层、内核层、硬件设备等几个部分。其中内核层又可以分为接口层,硬件无关层和内核硬件相关层(图2中虚线部分),可以分为以下几个方面来描述。
![](http://www.51x86.com/include/picture/500/400/data/10-01/16288618020159/1263824987_d5101f19.jpg)
第一,用户层可以通过内核提供的sysfs文件系统和设备驱动模型(LDM)接口来进行电源管理。DPM实现还提供Proc接口来实现电源管理的命令;也可以通过增加系统调用接口使用户程序更容易调用DPM功能。
通过修改任务切换宏switch_tO,添加dpm_set_OS(task_dpm_ state)接口,然后电源管理引擎将当前任务电源状态设置到硬件参数。
第二,内核硬件无关层提供电源管理逻辑控制框架。电源管理引擎主要实现API调用,选择操作点,提供操作点设置的同步和异步逻辑等。
设备电源管理模块还实现设备驱动约束,通过LDM接口管理设备时钟和电源,提供挂起和恢复控制。 设备时钟电源关层主要对应系统的各种总线和设备时钟电源参数管理。
3.2.3 设备电源管理和驱动约束
DPM通过LDM可以对设备进行电源管理。LDM中device_driver结构有设备挂起和恢复等回调函数,device结构有驱动约束。需要在设备初始化时使用注册函数向相应系统总线注册该设备。例如,简化后12C的LDM相关参数为:
![](http://linux.ccidnet.com/col/attachment/2007/4/1068845.jpg)
I2C驱动注册到MPU公有TI外围总线:driver_reg- ister(&omap_i2c_driver)platform_device_register(&omap_i2c_device)。 在驱动程序中实现挂起和恢复函 数:omap_i2c_controller_suspen(&omap_i2c_device),omap_i2c_con- troller_resume(&omap_i2c_deviee)。这样,所有注册到系统的设备在sysfs中都有一个管理接口。通过这些接口 可以操纵设备的电源状态。在多种情况下,可利用该接口来挂断设备,例如:应用程序显式挂断应用中不需要的设备;平台挂起前需挂断所有设备;当DPM将系统 设置到设备不兼容状态时需挂起该设备等等。其中DPM中管理设备电源状态时还提供设备驱动约束检查(频率相关)。例如,当系统电源状态改变,准备运行在新 的操作点时,驱动约束检查该状态是否满足设备正常运行。如果不满足,且当前操作点force属性设置为1,设备首先被LDM回调函数关断(或将设备置于和 此时PLL相应的挂起状态);如果满足条件,则利用设备驱动中实现的调节函数转到新状态。
驱动约束还用于限制DPM操作方式。当没有设备被使用时,约束才允许DPM将系统转到低电源空闲状态。
4 总 结
DPM技术通过内核模块的方式实现任务级别电源管理、实现了有效的设备电源管理,满足了嵌入式Linux的需求,补充了基于桌面系统APM和APCI电源管理技术的不足。实践证明,DPM对嵌入式系统,尤其是移动终端,能够起到很好的节能效果。
当然,动态电源管理系统还有待于进一步完善。例如:①可以根据硬件和软件收集系统负载状态,使用Markov,链等手段准确预测电源状态,从而设计出更智能、更有效的状态切换管理策略;②电源管理和实时性能要求之间的复杂关系还需处理等等。