在所有版本的Windows CE操作系统中,图形、视窗和事件子系统(GWES)在电源管理方面都发挥了关键作用。这是因为早期版本的电源管理功能是由用户的活动所驱动的,而GWES负责处理所有用户的输入,如键盘、鼠标和触摸屏。GWES设置定时器监控用户的活动,当一段时间内用户没有任何输入时,便使系统进入休眠状态。通过注册表可以设置这几个定时器的超时值,它们可以分别被用于电池供电或外部电源供电时。当然,通过注册表也可以禁用GWES的电源管理功能,它在Windows CE.NET以后的版本中是默认被禁用的,这有利于电源管理器的集中管理。 图1 Windows CE基本的电源转换流程 上图是Windows CE系统基本的电源状态转换策略,对应有5种系统电源状态(等级):No Power, On, Suspend, Idle, Critical off。相关描述和转换方式参见上表。 基本的电源管理功能所采用的节能方法是使系统适时的进入休眠状态,当下面的一种事件发生时,系统将进入休眠状态(SUSPEND): 用户按下On/Off按钮; ?监控用户活动的定时器超时; ?应用程序调用API,如GwesPowerOffSystem或SetSystemPowerState。 当下面的一种事件发生时,系统将退出休眠状态: ? ?用户再次按下On/Off按钮; ? 发生某个警告事件,如某个日期或时间定时器的到时提醒; 发生某个唤醒事件,由外设如串口设备或者网卡触发中断来唤醒系统。 虽然通过用户操作、应用程序或者外设都可以使系统进入或者退出休眠状态,但基本的电源管理功能所能控制的粒度过大,对应于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可以根据需要设计自己的电源管理策略。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。