在所有版本的Windows CE操作系统中,图形、视窗和事件子系统(GWES)在电源管理方面都发挥了关键作用。这是因为早期版本的电源管理功能是由用户的活动所驱动的,而GWES负责处理所有用户的输入,如键盘、鼠标和触摸屏。GWES设置定时器监控用户的活动,当一段时间内用户没有任何输入时,便使系统进入休眠状态。通过注册表可以设置这几个定时器的超时值,它们可以分别被用于电池供电或外部电源供电时。当然,通过注册表也可以禁用GWES的电源管理功能,它在Windows CE.NET以后的版本中是默认被禁用的,这有利于电源管理器的集中管理。
图1 Windows CE基本的电源转换流程
状态及其转换 | 描述 |
---|---|
No Power | 既没有电池也没有外部电源供电. |
On | 所有设备上电的常规运行状态. |
Suspend | 休眠状态,这时大部分设备关闭,仅RAM(自刷新)和外部时钟运行. |
Idle | 空闲状态,这时可停止CPU的运行. |
Critical off | 电池电压过低的状态. |
Power-on reset | 系统清空RAM并初始化文件系统. |
Cold boot | First application of power, for example, when a backup battery is installed. |
Warm boot | 软启(热启动),清空RAM并返回运行(On)状态. |
On-to-Idle | 从全速运行状态到空闲状态的转换. |
Idle-to-On | 处理器从低功耗状态回到全速运行状态. |
On-to-Suspend | 由于某些事件的触发,处理器转换到停止运行状态。并调用设备驱动函数 XXX_PowerDown. |
Suspend-to-On | 由特定的唤醒事件触发,处理器从停止状态返回到全速运行态。并调用设备驱动函数XXX_PowerUp. |
On-to-Critical off | 当电池电压过低时转换到Critical off状态. |
上图是Windows CE系统基本的电源状态转换策略,对应有5种系统电源状态(等级):No Power, On, Suspend, Idle, Critical off。相关描述和转换方式参见上表。
基本的电源管理功能所采用的节能方法是使系统适时的进入休眠状态,当下面的一种事件发生时,系统将进入休眠状态(SUSPEND):
l 用户按下On/Off按钮;
l 监控用户活动的定时器超时;
l 应用程序调用API,如GwesPowerOffSystem或SetSystemPowerState。
当下面的一种事件发生时,系统将退出休眠状态:
l 用户再次按下On/Off按钮;
l 发生某个警告事件,如某个日期或时间定时器的到时提醒;
l 发生某个唤醒事件,由外设如串口设备或者网卡触发中断来唤醒系统。
虽然通过用户操作、应用程序或者外设都可以使系统进入或者退出休眠状态,但基本的电源管理功能所能控制的粒度过大,对应于CPU只有三种状态:On,Idle和Suspend,对应于所有外设只有两种状态:On和Suspend。而且,当系统进出休眠状态时,应用程序都得不到任何通知。
Windows CE的高级电源管理功能
加入了电源管理组件的Windows CE具有高级的电源管理功能,它允许每个外设具有自己的电源状态,有别于一般的系统电源状态(System Power State),被称作设备电源状态(Device Power State)。现在应用程序有能力设置个别外设的电源状态,比如一个文件传输程序,在保持串口或者蓝牙端口正常通讯时,可以关闭显示屏幕和背光。这就为实现更高级别的动态电源管理提供了可能。
我们可以通过注册表任意设定一组系统电源状态,使其对应于我们设计的状态模型。对于设备电源状态则没有这么大的灵活度,它具有5个设备状态:
D0:Full on;D1:Low on;D2:Standby;D3:Sleep;D4:Off
当定义好系统电源状态,并为每个外设分配了设备电源状态后,通过注册表,我们可以将两者进行映射。在某个系统电源状态下,比如一个电池供电的系统,当电池电量已经少于50%时,显示屏幕和背光可能处于D1状态,而网络设备可以设置为D3状态。也就是说,在同一时刻,不同的外设可能处于不同的设备电源状态中。这样的灵活性意味着每个设备可以最小程度的消耗电池资源。
图2 Windows CE高级电源管理框架
如图2所示,电源管理器实现为一个名为Pm.dll的动态链接库,电源管理接口分为应用程序和驱动程序两部分。驱动程序通过DeviceIoControl服务例程来处理电源管理器发来的设备电源状态改变请求,另外电源管理器通过消息队列通知应用程序电源相关的事件。
为了获得高级电源控制的功能,必须通过Platform Builder将电源管理组件编译到内核镜像中。实现的源代码参见{WINCEROOT}\Private\Winceos\Coreos\Device\PMIF\pmif.c,这段代码只是一个封装,它会调用{WINCEROOT}\Public\Common\Oak\Drivers\PM中的组件。参考这个实现OEM可以根据需要设计自己的电源管理策略。
下一篇将分三个部分来解读WinCE的电源管理,首先从系统平台开发的角度,这部分一般由OEM厂商负责实现,然后介绍电源管理的接口,分别从设备驱动和应用程序的角度介绍如何应用电源管理。
* 原创文章,转载请注明出处
来源:https://www.cnblogs.com/jasonye/archive/2008/03/06/1040008.html