1.什麼是WinCE電源管理
(1)電源管理概念與方法
在電池供電的移動嵌入式系統中,一般採用高效率的電源晶片用於供電管理,或採用大容量的電池以解決能耗需求,但這兩種技術的發展還無法滿足移動嵌入式裝置的動態功耗和靜態功耗。有一種方法可以協調高效能與低功耗之間的矛盾,就是根據系統負載進行效能調節,通過停止某些模組的時鐘和電源供應將能耗降至最低。
嵌入式系統按功率消耗由小到大分為睡眠(sleep)、空閑(idle)、運行(Run)等模式。大多時間內,在運行態(Run)時裝置全部正常工作,而在睡眠與空閑模式時處理器則可以按照特定的模式進行相應的節能。因此,電源管理的目的是節能,基本節能方法是使系統適時的進出休眠狀態。在節能狀態下處理器掛起,主儲存空間運行在節能的自重新整理模式,只有功耗管理電路、喚醒電路繼續工作。比如使用者按下On/Off按鈕,或者監視使用者活動的定時器逾時,或者應用程式API都可以使得嵌入式系統休眠,當使用者再次按下On/Off或者有其他喚醒中斷髮生時,系統就會退出休眠。因此,電源管理模組和使用者活動情況密不可分,電源管理是使用者活動所驅動的。
WinCE處理使用者與系統互動的部分是GWES,所以早期電源管理工作也是由GWES來實現。但GWES提供的電源管理模組功能過於粗糙死板,所有子裝置只能有On和Suspend狀態,應用程式無法得到任何狀態轉換通知。後來,WinCE引入了電源管理PM(Power Manager)模組,用以替代GWES中的電源管理功能,新的電源管理模組提供更完整和靈活的功能,如子裝置電源狀態可以單獨設定,應用可以獲得電源通知等。因此,電源管理器負責管理裝置電源,並且與不支援電源管理功能的裝置和應用相容,在核心OAL層、裝置驅動程式和應用程式之間充當中間人角色。
(2)電源管理器結構
在使用電池供電的WinCE系統中,正確設計電源管理十分關鍵。在功能上大致可以分為系統級電源管理、動態電源管理、裝置電源管理等三類。通常,應用程式在大多數時間都不需要關注WinCE 裝置的電源損耗,但是在某些時候要注意這些損耗。WinCE電源管理器通過一個名為Pm.dll的動態連結程式庫與裝置管理員Device.exe連結。Pm.dll動態連結程式庫支援三類介面:一是驅動程式介面:為需要進行電源管理的裝置的驅動程式使用;二是應用程式介面:為需要利用電源管理的應用程式使用;三是提醒介面(Notification):為需要接受電源事件提醒的應用程式使用。
例如,WinCE系統先檢查任務負載情況,如果沒有需要啟動並執行任務,則一般進入空閑節能狀態等待喚醒,在空閑一段時間後進入深度睡眠,掛起到RAM中或者硬碟上。在運行任務期間,WinCE還可以利用硬體提供的電源管理功能動態調節晶片運行電壓和頻率,對系統進行更加細緻的電源管理。
2.WinCE電源管理的分類
(1)系統電源狀態
Win CE系統電源狀態更多的是代表系統電源的一種配置方案,它是各個子裝置電源配置的集合。它設定一種可能出現的情景,事先擬定了此情景下電力分配策略(哪些子裝置開啟,哪些子裝置關閉)。WinCE支援以下幾種電源狀態:①ON狀態,使用者在主動使用裝置。②UserIdle狀態,使用者與裝置停止互動,但仍有可能使用裝置。③SystemIdle狀態,在經過一段時間的UserIdle後進入此狀態,但是驅動和系統仍然活動。④Suspend狀態,當驅動程式和系統進程不再與系統互動時進入此狀態。⑤ColdReboot和Reboot狀態,冷啟動後系統電源狀態。
因此,在這個基礎上技術人員可以根據自己的平台特點,增加新的策略來滿足不同移動嵌入式產品的需要。常見的做法是設計一個電源按鍵的流驅動,當檢測到按鍵時候呼叫API將系統電源轉換到Suspend,如On/Off按鍵。還有就是加入背燈控制,比如在On狀態下請求顯示驅動開啟背燈,在UserIdle和SystemIdle狀態下請求顯示驅動關閉背燈。
(2)裝置電源管理
WinCE加入了進階的電源管理組件功能,它允許每個外設具有自己的電源狀態,這有別於一般的系統電源狀態(System Power State),故被稱作裝置電源狀態(Device Power State)。現在的應用程式一般都有能力設定個別外設的電源狀態,比如一個檔案傳輸程式,在保持串口或者藍芽連接埠正常通訊時,可以關閉顯示螢幕和背光,這就為實現更進階別的動態電源管理提供了可能。
電源管理器和支援電源管理的裝置之間的互動包括兩種機制:一是電源管理器到驅動程式,電源管理器使用DeviceIoControl()函數向裝置驅動程式發送I/O控制(IOCTLs),因此裝置必須能響應電源管理器的查詢、狀態設定等IOCTLs。二是驅動程式到電源管理器,驅動程式使用DevicePower Notify()函數與電源管理器互動,例如請求電源管理器把它的裝置置於某種狀態,
如果電源管理器接受該請求則通過發送IOCTL_POWER_SET等IOCTLS來進行設定。
(3)應用程式與電源管理器互動
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負荷情況驅動,代表系統空閑;後者是使用者活動驅動,代表使用者空閑。
3.從應用程式互動分析電源管理狀態
當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,表示逾時值被禁止。
(4)電源通知
最後,電源管理程式還有一個十分受歡迎的特點,就是可以在系統電源狀態改變時通知應用程式,這可以讓應用程式從手動檢測電源狀態中解脫出來。
應用程式通過調用RequestPowerNotifications請求電源管理程式當電源狀態改變的時候,發送一個通知給應用程式,電源管理程式再通過一個由應用程式建立的訊息佇列發送此通知。
總之,嵌入式電源管理在WinCE系統是一個快速發展的研究課題。它對移動嵌入式產品的設計具有關鍵性影響,一個高效的電源管理設計可以協助移動嵌入式產品在市場競爭中脫穎而出,克敵制勝。
【編輯精選】