Windows CE的基本電源管理功能
在所有版本的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廠商負責實現,然後介紹電源管理的介面,分別從裝置驅動和應用程式的角度介紹如何應用電源管理。
* 原創文章,轉載請註明出處