Windows Mobile电源管理分析与实现

2011-03-26 16:13:07来源: 互联网

如今在以数码消费产品为代表的嵌入式系统领域,大多数系统采用电池供电,由于电池容量有限,这使得实现产品的低功耗,延长待机时间成为一个重要的课题。在已确定硬件电路功耗的情况下,提高电池电源的使用效率是实现低功耗的一个重要任务,其基本思想是在系统中没有任务等待运行时,把系统置于尽可能低的能量状态,等到有任务需要执行时,再将其快速唤醒,尽可能有效地利用功耗。

1 Windows Mobile中的电源管理

WinCE系列操作系统中的电源管理模块正是出于后者的考虑而出现的,图1为电源管理(Power Manager)的运行机制。该模块根据系统实际运行情况,以CPU为中心,管理器件和外设的功耗状态,实现系统在不同电源状态间的转换,从而在保证系统性能的前提下降低功耗。而Windows Mobile系统针对其专用于移动通信平台的特点,对电源管理部分做了进一步的定制,使其具有更好的效能,进一步提高系统的电源效率。

Power Manager的实现在软件上需要OS内核、驱动层及应用层的协作,对于预先定义好的系统电源状态,Power Manager将这些状态映射到具体的CPU电源状态和设备电源状态,在系统电源状态切换时就会执行对应的CPU和外设的电源状态切换操作。

1.1 电源管理与系统其他部分的交互

在Windows Mobile中Power Manager以名为PM.dll的动态链接库形式在启动时被设备管理器De-vice.exe加载,如图2所示。

应用程序可通过API申请将系统电源置于一定的状态,同时也可申请将指定设备设置于特定的电源状态,应用程序也可以申请电源状态通知,以便在系统电源状态切换时收到消息以执行对应的操作。当需要切换系统电源状态时,电源管理模块与电源管理的设备通信,进而调用这些设备的电源相关函数,实现对这些设备的电源管理,同时如果有应用程序或设备驱动申请了电源状态通知,则电源管理模块会向消息队列中发送消息。

1.2 Windows Mobile中的电源状态以及状态间的切换

Windows Mobile有两个版本,SmartPhone和Pocket PC,这里采用是Windows Mobile 6的PocketPC,它定义了以下几个电源状态(Windows Mobile的电源状态是不能像WinCE那样再定制的):

ON:用户与系统交互时的状态;

Backlight OFF:在一段时间内(默认15 s),如果一直没有用户操作就关闭背光,这时其他的设备都没变化;

Screen OFF:一般由某些程序指定,才进入这个状态。比如音乐播放器程序,当你听音乐时按下某个键可以将屏幕关闭;

Suspend:Pocket PC的睡眠模式,几乎所有设备都被关闭,直到某个硬件设备触发中断才将系统唤醒,这是Pocket PC系统中功耗最低的一个状态,对这个状态的实现直接影响到待机时间;

Resuming:Pocket PC被唤醒后的状态,这时屏幕是关闭的,并启动一个15 s的计时器,在这段时间内决定接下来进入哪个状态,如果计时器超时则重新回到睡眠状态;

Unattended:这个状态只在Pocket PC中被使用,用户对其不会有所察觉,即程序在后台执行。

这里可以用系统电源状态机来简单地描述Win-dows Mobile的电源管理策略。以Pocket PC为例,系统电源状态机如图3所示。

系统内部的电源管理器负责协调电源状态的转换,电源状态的转换主要由计时器超时(Timeout)、电源键事件(ON/OFF Event)、用户操作(User Activity)等方式触发。

2 PXA270平台上电源管理的实现

电源管理的实现,涉及到系统中软件硬件的互相配合。对于软件来说,涉及到各个层面,包括Windows Mobile内核和设备驱动,这二者主要负责电源管理在处理器和物理外设等硬件上的实现,另外有些应用程序也会有涉及,这主要是系统电源状态与具体应用需求之间的协调。这里应用的平台是开发的基于PXA270的Windows Mobile智能手机平台,该平台搭载了NXP的基带处理器及其外围电路。以实现GSM通信。另外,还有蓝牙、摄像头等功能模块,因此对该平台进行电源管理优化是十分必要的。

2.1 内核电源管理的实现

2.1.1 Suspend/Restlume模型

对于SmartPhone,采用的是AlwaysOn模型,只是在工作一段时间后关闭背光和屏幕,但是系统仍在运行。该平台实现的是Pocket PC,采用Suspend/Re-sume模型,在系统处于空闲时,可将系统置于Staspend状态,此时系统处于最低的功耗状态,在必要时再将其唤醒。在两个模型之间需要权衡,虽然Always On没有休眠模式,但是Suspend/Resume在Suspend和ON之间切换也是需要消耗大量能量的。系统电源状态的切换最终会导致内核中OEM函数的调用,下面重点介绍内核中电源管理的实现,在Windows Mobile的样例BSP中有示例代码框架在Off.c和Xllp_SuspendAn-dResume.c可供参考。

2.1.2 Suspend流程

在平台实现上,切换至Suspend状态时会调用OEMPowerOff函数,此时会将外设关闭,将PXA270处理器置于sleep模式,OEMPowerOff中Suspend的具体流程,即Xllp_SuspendAndResume函数如下:

(1)设置当前程序状态寄存器CPSR的I位和F位,以禁止IRQ和F1Q中断;

(2)根据第一步中获得的地址,将Power,Inter-rupt,GPIO,CLOCK等硬件平台及OS相关的寄存器保存在Xllp_SuspendAndResume函数的全局变量中,即将这些寄存器的值保存于SDRAM中;

(3)保存ARM架构下处理器模式的相关寄存器值,除了User模式的6种处理器模式,需保存的是SP,LR,和SPSR。另外,FIQ模式还需保存R8~R12。为了使用stmdb批拷贝指令,在此使用“伪堆栈”,即用SDRAM中的物理空间来模拟堆栈;

(4)配置MDREFR寄存器,设置好SDRAM的自刷新频率。在sleep模式下,SDRAM将处于自刷新状态以维持之前保持的状态数据,供系统唤醒时恢复到sus-pend之前的状态;

(5)利用PSPR寄存器来保存Resume参数的物理地址,如重启原因、睡眠模式等,PSPR的数据在sleep时不会丢失;

(6)配置PWER,PRER或PFER寄存器,以使能特定的唤醒源,这里设置RTC、来电RING中断和电源键的唤醒;

(7)保存当前处理器模式的状态寄存器,保存MMU寄存器,保存Restlme的返回地址XllpRes-umePhase3,回写Cache,配置CP14寄存器CR7,让处理器进入sleep模式。到此,PXA270进入sleep模式,系统处于Suspend电源状态。

2.1.3 Resume流程

总的说来,Resume流程与Suspend是相反的,处理器初始化之后,会载入Suspend之前保存在SDRAM中的各种状态参数,恢复之前状态,其流程简要介绍如下:

(1)当已使能的唤醒事件发生时。处理器会从BootLoader启动,进行基本的硬件初始化之后。会判断是Reset,还是sleep Resume,如果是后者,则会跳转到Xllp_ResumePhase2A;

(2)在Xllp_ResumePhase2A中首先会将保存在PSPR中的参数取出,检查无错误后,重新配置好MMU,载入处理器状态寄存器和堆栈,跳转至XllpRe-sumePhase3;

(3)在XllpResumePhase3载入所在环境的处理器状态寄存器,接着逐级返回至OEMPowerOff函数,在OEMPowerOff函数中会获得唤醒源,然后退出;

(4)此时系统由Power Manager置于Resuming状态,Power Manager 根据唤醒源判断是否将系统置于ON,还是继续Suspend。

此时,系统状态已经恢复至睡眠之前,结束了Re-sume流程,完成对系统的唤醒。

2.2 设备驱动电源管理的实现

除了对处理器的电源管理,Power Manager还有一个主要工作就是平台上设备的电源管理。对于只有ON和OFF两种电源状态的设备,Power Manager通过DeviceIOControl在Suspend和Resuming时分别调用各设备驱动中实现的PowerUp和PowerDown函数,以开启和关闭设备。在该平台上大多数设备都属于这种管理方式,包括LCD,Aladio Codec等,这些工作主要是在Wince流驱动的IOControl中执行一些开启或者关闭处理器I/O电源的操作。

对于GSM和蓝牙等较复杂的设备,需要能及时唤醒,如在系统Suspend来电时,GSM模块需快速唤醒并做出响应,因此这些设备也支持sleep等模式。在进入Suspend会相应调用这些设备驱动的sleep函数,进入设备的省电模式,而在Resuming时也会调用对应的退出sleep的函数,以实现快速唤醒。

2.3 应用程序电源管理的实现

在此以自己编写的基于DirectDraw的照相程序为例来说明应用程序中电源管理的实现。

首先,在开启照相程序时,预览一段时间没有操作后,不希望按照定时器的值进入Suspend,此时需定时修改SuspendTimeout,以阻止系统进入睡眠状态。具体做法是:启动一个30 s的定时器,每30 s调用一次SystemIdleTimerReset函数。另外,由于该照相程序是Overlay显示效果,在进入拍照程序后,如果按下电源键进入Suspend状态,再唤醒时系统仍处于拍照程序,但是由于PXA270的LCDController没有再次创建Overlay层,因此程序不能显示图像。从使用者的角度考虑,在系统Reume之后照相程序应能恢复正常。做法如下:在程序中创建一个线程,用CreateMsgQueue创建一个消息队列,调用RequestPowerNotifications申请获得电源管理消息,然后调用WaitForSingleOb-ject等待通知,当收到Suspend的消息时,对程序窗口发送重新初始化Overlay的消息,在Resume后,程序会马上执行重新初始化的流程,照相程序恢复正常。

3 数据分析

对系统运行时几个典型电源状态的电流值做了测量,数据如表1所示。

4 结 语

[1] [2]

关键字:windows  mobile  分析  实现

编辑:神话 引用地址:http://www.eeworld.com.cn/mndz/2011/0326/article_6179.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
windows
mobile
分析
实现

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved