![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
Win CE应用程序与电源管理器有两种交互机制:一是应用程序接口,用以获取当前系统和设备的电源状态。应用程序通过SetSystemPowerState()来设置系统电源状态,通过SetDevicePower来设置子设备电源状态,通过SetPowerRequirement通知电源管理器将子设备设置在特殊电源状态下,不随系统电源改变。二是电源事件提醒接口。为了实现提醒接口,应用程序还可通过CreateMsgqueue()函数建立消息队列,将其句柄传给电源管理器,电源管理器再把提醒发送到消息队列中,调用者可选择可用提醒的一个子集进行响应。
(4)OAL层电源管理的实现
OEM Adaptation Layer(OAL)是一层与硬件平台相关的代码,它在电源状态转换中扮演着重要的角色。在WinCE中,OAL层电源管理通过OEMIdle()和OEMPowerOff()函数实现。其中OEMInit是初次上电时(或在冷启后)被调用,如初始化系统内存,建立调试环境,设置系统中断等;当系统中没有任何可调度的线程时,内核就调用OEMIdle()以实现降低处理器的频率来达到省电目的,这个函数在BSP中可以由OEM修改定制。
当有外部中断时,CPU可从其中恢复,如当用户按下OFF按钮或者应用调用API进入suspend状态时候,内核会调用OEMPowerOff()函数,在系统唤醒后继续从OEMPowerOff()被挂起处执行。OEMPowerOff函数是基于硬件平台来实现的,它能进行CPU寄存器保存、设置及唤醒恢复等功能。系统Idle状态和前面说的UserIdle状态是不同概念,前者是CPU负荷情况驱动,代表系统空闲;后者是用户活动驱动,代表用户空闲。
2.从应用程序交互分析电源管理状态
当WinCE 系统被挂起,为了省电用户需要关闭处理器及大部分设备供电,然后在需要唤醒时再通过定时器或无线模块唤醒。一般来说,被唤醒后系统会返回到与系统挂起前一样的状态,因此应用程序根本不知道系统曾被挂起,除非它明确地请求当系统挂起时通知它。因此从应用程序的角度看,电源管理有三种方式:查询电源状态、改变电源状态和防止电源状态改变。
(1)查询电源状态
对嵌入式系统来说,OEM厂商定义了系统的电源状态。例如,电源状态可能是打开(On),空闲(Idle)和挂起(Suspend),还有ScreenOff、InCradle和 OnBattery等。从应用程序的观点看,电源管理程序提供了通知电源状态改变的能力以及通过一系列的函数统一改变电源状态的能力。
因此,查询系统当前的电源状态是WinCE的一个重要功能,可以调用DWORD GetSystemPowerStatusEx2(PSYSTEM_POWER_STATUS_EX2,DWORD dwLen,BOOL fUpdate)来查询。函数用三个参数来告诉WinCE系统查询电池驱动最后的信息或者直接返回电池缓存中的信息,系统大约每5秒查询一次电池状态。又因为WinCE不验证电池驱动返回的数据,因此不同的系统有不同的变化,这个函数返回来的数据是主要依赖于电池驱动。例如,许多系统在使用AC电源时不报告精确的电源级数,另一些系统则相反。
(2)改变电源状态
应用程序能通过一系列的方式改变系统的电源状态,在WinCE中首选的方式是使用电源管理程序。电源管理程序提供函数来允许应用程序来控制电源状态,如应用程序通过调用函数SetSystemPowerState来请求特定的电源状态。一般有两个方式来控制电源,第一个方式是应用程序给定一个电源设定;第二个方式是应用程序请求电源状态不要低于给定的级别。
常见的例如:①关闭电源,应用程序通过调用GwesPowerOffSystem函数挂起系统,如函数void GwesPowerOffSystem(void)的调用就会挂起系统。② 关闭屏幕,如果系统是有色背光显示,那么主要的电源消耗不是CPU而是背光。在某一些环境下,一个应用程序运行时并不需要显示在屏幕上。例如音乐播放器应用程序,当用户听音乐的时候不关注屏幕,在这些情形下关闭背光将意味着提高电池寿命。当然,当用户想看屏幕时,任何关闭背光应用程序就需要一个简单的方式来重新打开屏幕。显示控制是通过Ext-Escape函数实现,这个函数允许应用程序打开或关闭显示。另外,WinCE没有一个统一的方式来控制背光的亮度,每个系统都有它自己的OEM特有方式来控制背光亮度。③打开系统电源,意思是说当被挂起的应用程序要再次运行时,必须要有一个方式来唤醒一个挂起的系统电源。方法可以是应用程序通过使用消息API(Notification API)把系统唤醒。在一般情况下,OEM厂商会分配一些中断条件以便电源打开或唤醒。
(3)防止系统关闭电源
另一方面,防止系统挂起也是一个重要的问题。WinCE系统通常被设置为当一段时间没有用户输入就自动挂起。因此,如果定时器到达预先的没有用户输入的间隔,系统会自动挂起。当要防止自动挂起时,应用程序可以周期性地调用这个函数:void WINAPI SystemIdleTimerReset (void),这个函数能重设WinCE用来监视用户输入的定时器。所以当一个应用程序需要更改超时值时,就可以通过调用SystemIdleTimerReset把挂起超时值改变。一般来说,WinCE系统维护三个超时值,防止电源被自动挂起可以使用SystemParametersInfo来查询这三个值,并在最短时间内返回调用SystemIdleTimerReset。如果超时值被设置为0,表示超时值被禁止。 |
|