Windows Mobile电源管理分析与实现

windows mobile电源管理分析与实现
如今在以数码消费产品为代表的嵌入式系统领域,大多数系统采用电池供电,由于电池容量有限,这使得实现产品的低功耗,延长待机时间成为一个重要的课题。在已确定硬件电路功耗的情况下,提高电池电源的使用效率是实现低功耗的一个重要任务,其基本思想是在系统中没有任务等待运行时,把系统置于尽可能低的能量状态,等到有任务需要执行时,再将其快速唤醒,尽可能有效地利用功耗。
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 200 ma/h的电池,该智能手机平台能达到160 h左右的理论待机时间,以及3 h左右的通话时间。另外,睡眠及唤醒的响应时间也在1 s左右,表明power manager达到了提高电池电源使用效率的目标,基本满足实际应用的需求。

基于环形队列的串口打印阻塞解决方法
华为云等保解决方案提供一站式信息安全保障体系,为您的企业安全保驾护航
!租售/回收/维修CMD60综合测试仪CMD60 小兵/李S
爱立信与Azercell Telecom合作将在阿塞拜疆部署5G网络服务
医疗器械研发设计医疗设备二次开发克隆仿制
Windows Mobile电源管理分析与实现
iPhone8什么时候上市?iphone7s/iphone 8即将发布,外观将大改,有许多新功能,史上最贵的iphone8你买吗?
用Rust重写了自己的项目
smt贴片加工工艺材料的种类与作用
董明珠继续造车梦 拉王健林入伙投资珠海银隆
东风雪铁龙ADAS高级驾驶辅助系统初体验
开源AI技术平台是核心推动力,谷歌Facebook和百度呈三强局面
未来徐汇人工智能将如何发展?
数据洪流转向边缘 如何发掘边缘数据的价值?
中国集成电路少不了EDA EDA生态系统应运而生
万兆以太网和IP SAN的融合
你们知道FIFO最小深度计算吗
iGameZ390VulcanX主板高清图赏
CAD中组(Group)如何应用,组和图块有何区别?
AITO问界M7发布 基于HarmonyOS华为打造软硬协同的鸿蒙智能座舱体验