基于Monahans的嵌入式电源管理方案

发布时间:2011-09-14
                          许文杰1 丁志刚2,3 张伟宏2,3
(1.  上海市计算技术研究所,上海 200040;2. 上海计算机软件技术开发中心,上海 201112;3. 上海嵌入式系统应用工程技术研究中心,上海 201112)
       目前,在手机、PDA等嵌入式产品中,随着音频、视频和图像处理等功能的越来越多样化,对电池的使用时间提出了更大的要求。在此类产品设计当中,不论硬件还是软件,电源管理的作用越来越重要。本文在基于Monahans处理器的硬件平台和Linux操作系统下实现了电源管理功能。
1 Monahans处理器电源管理单元 [1]
       Monahans处理器内部集成了电源管理的主控制单元、从控制单元来完成频率电压及电源状态的切换。其中主控制单元分为主电源管理单元(Services Power Management Unit, SPMU)和主时钟控制单元(Services Clock Control Unit, SCCU);从控制单元分为从电源管理单元(Slave Power Management Unit, BPMU)和从时钟控制单元(Slave Clock Control Unit, BCCU) ,上述单元协同工作从而减少了电量消耗。
1.1 主控制单元
1.1.1 主电源管理单元
       SPMU控制主单元和从单元中电源状态的转换和各模块的重置操作,并且通过I/C接口连接到外部的供应稳压器。通常把由SPMU所控制的电源状态称为S状态。
1.1.2主时钟控制单元
       SCCU包含了处理器所用时钟的分频、选通和选择等功能。它提供了5种时钟供BCCU使用,包括处理震荡器、报时震荡器、核心锁相环(Phase-Locked Loop, PLL)、系统PLL和环形震荡器。此类时钟的具体介绍见参考文献[1]。
1.2从控制单元
1.2.1 从电源管理单元
       BPMU控制的应用子系统包括XScale核及其内部SRAM的电源管理功能。由BPMU控制的电源状态称为D状态,而XScale核自身的电源状态称为C状态。
1.2.2 从时钟控制单元
       BCCU使用SCCU所提供的时钟来生成并控制应用子系统的时钟源。Monahans处理器支持一系列操作点(Operation Point, OP)。每个操作点对应特定的CPU 核及外设频率。此类操作点信息如表1所示。
1  Monahans 标准 OP
OP
处理器
频率/MHz
处理器
核心电压 /mV
高速系统
总线频率/ MHz
静态内存
频率/ MHz
0
60
1000
60
15
1
104
1000
104
104
2
208
1000
156
156
3
416
1100
208
104
4
624
1375
208
208
1.3 电源状态
       处理器的电源状态由services unit和application subsystem的各电源状态组合形成。在每种状态下,系统的消耗会也不相同。其模式包括S0/D0/C0、S0/D0CS/C0、S0/D0/C1、S0/D1/C2和S3/D4/C4 [1]
2 Monahans电源管理驱动层
       Monahans电源管理的软件实现由3个部分组成:硬件底层驱动,底层操作和硬件资源分配操作的封装,应用层的电源管理策略。
2.1动态电压频率管理
       当处理器的CPU核处于工作状态时,根据应用程序的需求,CPU核的工作频率要作出相应调整。动态电压频率管理为上层应用提供改变电压和频率的接口函数,且在驱动层要与各设备驱动协同工作。
当改变电压频率时,该驱动需要完成以下步骤:
1)          通知所有设备即将进行改变电压频率的操作,查询是否所有的设备都同意改变频率电压。
2)          若没有设备对此次操作有异议,则通知所有设备为频率电压的改变作准备。
3)          检测哪些频率需要改变。
4)          频率电压改变结束以后,通知所有设备使它们根据改变后的频率做相应的操作。
2.2电源状态切换操作
       当CPU处于空闲状态时,软件可以使其逐步进入相应的省电模式。此类省电模式包括S0/D1/C2、S0/D2/C2、S2/D3/C4和S3/D4/C4。Monahans的CPU核中,协处理器14的寄存器C7被设计用来控制相关电源状态的切换,指令形式为:
       mcr p14, 0, r5, c7, c0, 0
其中,r5代表要进入的省电状态。在进入省电模式时,进行程序现场的保护工作,并在退出省电模式时,对某些器件进行必要的设置,使程序能继续正常运行。省电模式的切换过程分为3步:
1)          设置与省电模式对应的唤醒源。
2)          根据即将进入的省电模式保存当前工作状态。
3)          设置协处理器寄存器,进入省电模式。
2.2.1 S0/D1/C2、S0/D2/C2
在这2种模式下, CPU核的时钟源已经停止但是供电依然存在,因此,用户模式以及各异常模式下的寄存器的内容都不会丢失,相关转换程序仅需保存要用到的通用寄存器。在执行完协处理器指令后加入多条OP指令以S0/D2/C2模式进入。例如在进入S0/D2/C2时会执行以下代码:
       1)   进入S0/D2/C2 模式
         mov   r5, #S0D2C2
         mcr    p14, 0, r5, c7, c0, 0                              
        2)   等待进入S2/D3/C4,执行若干条nop指令
在从S0/D1/C2或者S0/D2/C2状态中唤醒时,PC会指向以上nop指令中的某一条继续执行。
2.2.2 S2/D3/C4
        在这种模式下,CPU核已经完全断电,因此,在进入该模式时,将CPU核各模式下所有的寄存器值都保存到DDR SDRAM上。在从睡眠模式中唤醒时,控制权已经交给了Monahans的内部BootRom [1],整个系统会执行一次重置过程。此外,在进入S2/D3/C4时,还需要保存MMU控制寄存器的设置,并且把在内部SRAM上的启动地址拷贝到特定的寄存器中供BootRom使用。
2.2.3 DDR SDRAM操作
        在进入省电模式(除了S3/D4/C4)后,DDR SDRAM进入状态保持阶段,其上保存的内容不会丢失,但不能对其进行读写操作。从此类模式退出时,PC不能指向DDR SDRAM所占的地址空间,否则会导致错误的操作结果。在对SDRAM操作之前,须对SDRAM进行重新校正。执行S0/D1/C2或S0/D2/C2状态的切换代码必须被拷贝到内部SRAM上,同时这部分代码的结尾须完成对SDRAM的重新校正。在执行S2/D3/C4的状态切换操作时无需将相关代码拷贝到内部SRAM上,因为从S2/D3/C4唤醒时所有状态均为重置状态,重置后SDRAM会被重新校正,程序只要把S2/D3/C4之前的状态保存在SDRAM上即可。
2.3性能监测单元
       性能监测单元PMU [2]负责对处理器级别和Xscale核级别的各种事件进行监控,从而统计系统的运行状态。PMU可同时监测4个事件,如使用计数器PMN0来周期性地计算外部存储控制器占用总线的总时钟数,然后根据所得数据对CPU的操作频率进行调整。
2.4与Linux中电源管理部分的结合
       Linux内核中自带了电源管理代码 [3]。在接收到管理者通知时,内核会通知设备驱动程序、控制台等进入省电模式,并提供一些接口供平台相关的电源管理驱动来调用。
2.4.1 idle任务
       为了随时了解CPU的负载情况,可以在idle任务中利用OS Timer [1]来记录该任务的运行时间。调用idle任务的内核线程被周期性地唤醒,然后统计idle任务所运行的总时间长度,从而获得CPU的使用率busy_ratio并通知给上层决策者。若运行时CPU的使用率越高,则对操作点的要求也越高。管理者为每一个操作点定义了一个该操作点所能满足的CPU使用率区间,比如OP2所对应的区间为[40, 80]。当电源管理者得到的busy_ratio位于[40, 80]时,会把频率设置为OP2。若当前OP为OP2,而busy_ratio落在该区间之外,则管理者会增大或减小OP。
2.4.2 pm_ops结构体
         pm_ops结构体的定义如下:
struct pm_ops {
         int (*valid)(suspend_state_t state);
         int (*prepare)(suspend_state_t state);
         int (*enter)(suspend_state_t state);
         int (*finish)(suspend_state_t state);
         suspend_disk_method_t pm_disk_mode;
};
其中,prepare函数使平台为进入某一省电模式作准备;enter函数完成进入某省电模式的过程;finish函数在平台离开某省电模式时被调用。Linux内核提供了一个该结构体类型的全局指针pm_ops,平台相关的函数则被赋给该结构体内部的各函数指针。此外内核还导出一个函数pm_suspend()供上层决策者调用来进入节电模式,该函数则会依次调用全局变量pm_ops内部的相应函数以进入省电模式。
        在本系统的电源管理实现中,接口设备提供给决策者的命令会调用pm_suspend()接口函数。而电源状态的转换操作驱动会用平台相关的函数填充pm_ops结构体。如在进入S0/D2/C2状态时,决策者可通过如下代码发送命令来完成 [4] :
        ioctl(fd, CPU_MODE_SET, STANDBY);
其中,fd为指向接口设备的指针,CPU_MODE_SET为使系统进入省电模式的命令,STANDBY为该命令的参数,即让系统进入S0/D2/C2模式。
3上层电源方案决策者
        Monahans处理器电源管理相关驱动提供了调整频率电压以及在各电源模式之间切换的功能,并且定期报告当前系统的资源使用状况。但此类功能在什么时候使用,例如在什么情况下CPU的频率应该降低,什么情况下应该进入省电模式,则应该由上层的软件来决定 [5]。采用什么样的管理策略也很重要,比如等待时间的长短,为不同的应用程序选择合适的操作频率和电压都会对电池的使用时间造成很大影响。本文所采用的整个电源管理架构如图1所示。

1 Monahas 电源管理架构
       在图1中,电源管理决策者会实时监控整个系统的运行状态,包括应用程序、所有设备的需求、PMU的监测结果,然后将此类资源整合起来并根据当前的运行状态来决定系统要切换到的下1个状态。Monahas电源管理状态转换如图2所示。

2 Monahans 电源管理状态转换
3.1频率电压操作
        当系统处于运行状态时,电源管理者会实时获得应用程序针对CPU资源的各种需求信息,计算所有运行程序所需的最大频率电压值,然后把系统的频率电压设置到对应操作点。当某一设备需要开始运行时,它会以事件的形式将自己所需要的频率电压信息通知给电源管理者,电源管理者将该值与当前频率电压信息进行比较,再作出相应的调整。
3.2省电模式操作
        当仅有idle任务在运行并且所有的设备都处于空闲状态时,电源管理者停掉CPU核和外设的时钟或者关闭它们的供电,使系统进入某一省电模式。当CPU在某一规定的时间区间内一直处于空闲状态时,电源管理者设置唤醒源并使其首先进入轻量级的省电模式S0/D1/C2或者S0/D2/C2。若CPU在一段时间内一直处于上述省电模式,则被唤醒然后立即再次进入。该步骤重复几次后,电源管理者则使系统进入更为省电的状态S2/D3/C4。
4 电源管理实现
        本文研究的电源管理方法在一个基于Monahans处理器的智能导航平台上应用。为了专注于电源管理的效果,通过向电源管理者发送不同的消息来模拟应用程序的各种信息。电源管理相关参数设置如表2所示。
2 电源管理参数设置
默认频率/ MHz
PMU采样周期/ ms
S0/D2/C2时间/ s
CPU最多空闲次数
S0/D2/C2次数
624
200
15
6
10
其中,默认频率为CPU 重置之后的运行频率,系统每隔一个采样周期就对PMU统计数据进行分析;S0/D2/C2时间为系统进入被唤醒的间隔时间,其用途见3.2节;CPU在经过最多空闲次数后,会进入省电模式。应用程序与OP对应关系如表3所示。
3 应用程序与 OP 对应表            
应用
视频
MP3
文档编辑
游戏
默认
OP
4
0
2
3
2
         在表3中,各应用程序依次开始运行并结束,每个应用的运行时间为1s,应用之间的间隔时间为0.5s。程序运行顺序为视频、MP3、文档编辑、游戏以及默认。在关闭和开启电源管理功能的2种情况下系统运行频率信息对比如图3所示,核心电压信息对比如图4所示。
从图3、4中可以看出,在加入了电源管理功能后,频率和电压明显减小,在除了视频等要求CPU以最高OP运行的情况。在进入省电模式后,CPU的频率降为0或者电源被关掉,进一步减少了电量消耗。

3 系统频率对比
4 核心电压对比
         表4描述了在没有应用程序占用CPU时,各模式下对时间和能量消耗的对比信息。
4 无应用时的时间和能量消耗对比表
模式
进入时间/μs
退出时间/μs
能量消耗/ mW
idle(104MHz)
/
/
50(TBD)
S0/D2/C2
0.5s
0.5μs
<0.310
S2/D3/C4
78
7.9ms
<0.150
 
         由表4可知,因为idle时的功耗要远大于S0/D2/C2和S2/D3/C4时,所以应尽量减少CPU处于idle状态的时间;从S2/D3/C4状态唤醒所用时间要远大于从S0/D2/C2唤醒所用时间。在进入S0/D2/C2状态后并不会立即进入S2/D3/C4状态而是会反复几次退出到idle状态然后再进入S0/D2/C2。若期间无应用需求,则会进入S2/D3/C4状态。这样同时照顾对应用的响应时间和能量消耗,但不一定能够达到最好效果。在实际的应用系统中,若电池能量要求较高,则应尽快进入S2/D3/C4状态;若对响应的要求较高,则可以适当延长CPU处于idle或者S0/D2/C2状态的时间。
5 结束语
         本文基于Monhans的智能导航平台,通过驱动层与各设备协调工作完成对频率、电压和CPU温度的实时调整。在应用层通过模拟各种应用程序的实际运行与电源管理器进行交互。当有应用程序运行时,系统在满足应用程序正常运行的前提下运行最低功耗。当无应用程序运行时,为各省电模式设置相应的参数并同时考虑系统的功耗和响应时间。以上各功能模块相互配合来完成电源管理的功能,达到了预期目的。