WinCE電源管理應對移動(dòng)嵌入式能耗瓶頸
伴隨著(zhù)移動(dòng)嵌入式產(chǎn)品的普及,電源管理已經(jīng)成為重要技術(shù)指標和產(chǎn)品的有機組成。典型移動(dòng)嵌入式設備對能耗越來(lái)越敏感,電源管理技術(shù)正成為產(chǎn)品設計的關(guān)鍵所在。為了應對電源管理面臨的挑戰,如何設計出高效的嵌入式系統的電源管理已成為研究熱點(diǎn)。
本文引用地址:http://dyxdggzs.com/article/201610/305855.htm典型移動(dòng)嵌入式系統能耗主要部件包括嵌入式微處理器CPU、內存、LCD及背光、電源轉換部件、DSP、外設控制器等。在這些元件中,有些元件能耗固定,有些元件可在不同時(shí)間段工作并有多種可控的耗能狀態(tài),后者的有效使用成為嵌入式系統節能的關(guān)鍵所在。
1.什么是WinCE電源管理
(1)電源管理概念與方法
在電池供電的移動(dòng)嵌入式系統中,一般采用高效率的電源芯片用于供電管理,或采用大容量的電池以解決能耗需求,但這兩種技術(shù)的發(fā)展還無(wú)法滿(mǎn)足移動(dòng)嵌入式設備的動(dòng)態(tài)功耗和靜態(tài)功耗。有一種方法可以協(xié)調高性能與低功耗之間的矛盾,就是根據系統負載進(jìn)行性能調節,通過(guò)停止某些模塊的時(shí)鐘和電源供應將能耗降至最低。
嵌入式系統按功率消耗由小到大分為睡眠(sleep)、空閑(idle)、運行(Run)等模式。大多時(shí)間內,在運行態(tài)(Run)時(shí)設備全部正常工作,而在睡眠與空閑模式時(shí)處理器則可以按照特定的模式進(jìn)行相應的節能。因此,電源管理的目的是節能,基本節能方法是使系統適時(shí)的進(jìn)出休眠狀態(tài)。在節能狀態(tài)下處理器掛起,主存儲器運行在節能的自刷新模式,只有功耗管理電路、喚醒電路繼續工作。比如用戶(hù)按下On/Off按鈕,或者監視用戶(hù)活動(dòng)的定時(shí)器超時(shí),或者應用程序API都可以使得嵌入式系統休眠,當用戶(hù)再次按下On/Off或者有其他喚醒中斷發(fā)生時(shí),系統就會(huì )退出休眠。因此,電源管理模塊和用戶(hù)活動(dòng)情況密不可分,電源管理是用戶(hù)活動(dòng)所驅動(dòng)的。
WinCE處理用戶(hù)與系統交互的部分是GWES,所以早期電源管理工作也是由GWES來(lái)實(shí)現。但GWES提供的電源管理模塊功能過(guò)于粗糙死板,所有子設備只能有On和Suspend狀態(tài),應用程序無(wú)法得到任何狀態(tài)轉換通知。后來(lái),WinCE引入了電源管理PM(Power Manager)模塊,用以替代GWES中的電源管理功能,新的電源管理模塊提供更完整和靈活的功能,如子設備電源狀態(tài)可以單獨設定,應用可以獲得電源通知等。因此,電源管理器負責管理設備電源,并且與不支持電源管理功能的設備和應用兼容,在內核OAL層、設備驅動(dòng)程序和應用程序之間充當中間人角色。
(2)電源管理器結構
在使用電池供電的WinCE系統中,正確設計電源管理十分關(guān)鍵。在功能上大致可以分為系統級電源管理、動(dòng)態(tài)電源管理、設備電源管理等三類(lèi)。通常,應用程序在大多數時(shí)間都不需要關(guān)注WinCE 設備的電源損耗,但是在某些時(shí)候要注意這些損耗。WinCE電源管理器通過(guò)一個(gè)名為Pm.dll的動(dòng)態(tài)鏈接庫與設備管理器Device.exe鏈接。Pm.dll動(dòng)態(tài)鏈接庫支持三類(lèi)接口:一是驅動(dòng)程序接口:為需要進(jìn)行電源管理的設備的驅動(dòng)程序使用;二是應用程序接口:為需要利用電源管理的應用程序使用;三是提醒接口(Notification):為需要接受電源事件提醒的應用程序使用。
例如,WinCE系統先檢查任務(wù)負載情況,如果沒(méi)有需要運行的任務(wù),則一般進(jìn)入空閑節能狀態(tài)等待喚醒,在空閑一段時(shí)間后進(jìn)入深度睡眠,掛起到RAM中或者硬盤(pán)上。在運行任務(wù)期間,WinCE還可以利用硬件提供的電源管理功能動(dòng)態(tài)調節芯片運行電壓和頻率,對系統進(jìn)行更加細致的電源管理。
2.WinCE電源管理的分類(lèi)
(1)系統電源狀態(tài)
Win CE系統電源狀態(tài)更多的是代表系統電源的一種配置方案,它是各個(gè)子設備電源配置的集合。它設定一種可能出現的情景,事先擬定了此情景下電力分配策略(哪些子設備打開(kāi),哪些子設備關(guān)閉)。WinCE支持以下幾種電源狀態(tài):①ON狀態(tài),用戶(hù)在主動(dòng)使用設備。②UserIdle狀態(tài),用戶(hù)與設備停止交互,但仍有可能使用設備。③SystemIdle狀態(tài),在經(jīng)過(guò)一段時(shí)間的UserIdle后進(jìn)入此狀態(tài),但是驅動(dòng)和系統仍然活動(dòng)。④Suspend狀態(tài),當驅動(dòng)程序和系統進(jìn)程不再與系統交互時(shí)進(jìn)入此狀態(tài)。⑤ColdReboot和Reboot狀態(tài),冷啟動(dòng)后系統電源狀態(tài)。
因此,在這個(gè)基礎上技術(shù)人員可以根據自己的平臺特點(diǎn),增加新的策略來(lái)滿(mǎn)足不同移動(dòng)嵌入式產(chǎn)品的需要。常見(jiàn)的做法是設計一個(gè)電源按鍵的流驅動(dòng),當檢測到按鍵時(shí)候呼叫API將系統電源轉換到Suspend,如On/Off按鍵。還有就是加入背燈控制,比如在On狀態(tài)下請求顯示驅動(dòng)打開(kāi)背燈,在UserIdle和SystemIdle狀態(tài)下請求顯示驅動(dòng)關(guān)閉背燈。
(2)設備電源管理
WinCE加入了高級的電源管理組件功能,它允許每個(gè)外設具有自己的電源狀態(tài),這有別于一般的系統電源狀態(tài)(System Power State),故被稱(chēng)作設備電源狀態(tài)(Device Power State)?,F在的應用程序一般都有能力設置個(gè)別外設的電源狀態(tài),比如一個(gè)文件傳輸程序,在保持串口或者藍牙端口正常通訊時(shí),可以關(guān)閉顯示屏幕和背光,這就為實(shí)現更高級別的動(dòng)態(tài)電源管理提供了可能。
電源管理器和支持電源管理的設備之間的交互包括兩種機制:一是電源管理器到驅動(dòng)程序,電源管理器使用DeviceIoControl()函數向設備驅動(dòng)程序發(fā)送I/O控制(IOCTLs),因此設備必須能響應電源管理器的查詢(xún)、狀態(tài)設置等IOCTLs。二是驅動(dòng)程序到電源管理器,驅動(dòng)程序使用DevicePower Notify()函數與電源管理器交互,例如請求電源管理器把它的設備置于某種狀態(tài),如果電源管理器接受該請求則通過(guò)發(fā)送IOCTL_POWER_SET等IOCTLS來(lái)進(jìn)行設置。
(3)應用程序與電源管理器交互
Win CE應用程序與電源管理器有兩種交互機制:一是應用程序接口,用以獲取當前系統和設備的電源狀態(tài)。應用程序通過(guò)SetSystemPowerState()來(lái)設置系統電源狀態(tài),通過(guò)SetDevicePower來(lái)設置子設備電源狀態(tài),通過(guò)SetPowerRequirement通知電源管理器將子設備設置在特殊電源狀態(tài)下,不隨系統電源改變。二是電源事件提醒接口。為了實(shí)現提醒接口,應用程序還可通過(guò)CreateMsgqueue()函數建立消息隊列,將其句柄傳給電源管理器,電源管理器再把提醒發(fā)送到消息隊列中,調用者可選擇可用提醒的一個(gè)子集進(jìn)行響應。
(4)OAL層電源管理的實(shí)現
OEM Adaptation Layer(OAL)是一層與硬件平臺相關(guān)的代碼,它在電源狀態(tài)轉換中扮演著(zhù)重要的角色。在WinCE中,OAL層電源管理通過(guò)OEMIdle()和OEMPowerOff()函數實(shí)現。其中OEMInit是初次上電時(shí)(或在冷啟后)被調用,如初始化系統內存,建立調試環(huán)境,設置系統中斷等;當系統中沒(méi)有任何可調度的線(xiàn)程時(shí),內核就調用OEMIdle()以實(shí)現降低處理器的頻率來(lái)達到省電目的,這個(gè)函數在BSP中可以由OEM修改定制。
當有外部中斷時(shí),CPU可從其中恢復,如當用戶(hù)按下OFF按鈕或者應用調用API進(jìn)入suspend狀態(tài)時(shí)候,內核會(huì )調用OEMPowerOff()函數,在系統喚醒后繼續從OEMPowerOff()被掛起處執行。OEMPowerOff函數是基于硬件平臺來(lái)實(shí)現的,它能進(jìn)行CPU寄存器保存、設置及喚醒恢復等功能。系統Idle狀態(tài)和前面說(shuō)的UserIdle狀態(tài)是不同概念,前者是CPU負荷情況驅動(dòng),代表系統空閑;后者是用戶(hù)活動(dòng)驅動(dòng),代表用戶(hù)空閑。
2.從應用程序交互分析電源管理狀態(tài)
當WinCE 系統被掛起,為了省電用戶(hù)需要關(guān)閉處理器及大部分設備供電,然后在需要喚醒時(shí)再通過(guò)定時(shí)器或無(wú)線(xiàn)模塊喚醒。一般來(lái)說(shuō),被喚醒后系統會(huì )返回到與系統掛起前一樣的狀態(tài),因此應用程序根本不知道系統曾被掛起,除非它明確地請求當系統掛起時(shí)通知它。因此從應用程序的角度看,電源管理有三種方式:查詢(xún)電源狀態(tài)、改變電源狀態(tài)和防止電源狀態(tài)改變。
(1)查詢(xún)電源狀態(tài)
對嵌入式系統來(lái)說(shuō),OEM廠(chǎng)商定義了系統的電源狀態(tài)。例如,電源狀態(tài)可能是打開(kāi)(On),空閑(Idle)和掛起(Suspend),還有ScreenOff、InCradle和 OnBattery等。從應用程序的觀(guān)點(diǎn)看,電源管理程序提供了通知電源狀態(tài)改變的能力以及通過(guò)一系列的函數統一改變電源狀態(tài)的能力。
因此,查詢(xún)系統當前的電源狀態(tài)是WinCE的一個(gè)重要功能,可以調用DWORD GetSystemPowerStatusEx2(PSYSTEM_POWER_STATUS_EX2,DWORD dwLen,BOOL fUpdate)來(lái)查詢(xún)。函數用三個(gè)參數來(lái)告訴WinCE系統查詢(xún)電池驅動(dòng)最后的信息或者直接返回電池緩存中的信息,系統大約每5秒查詢(xún)一次電池狀態(tài)。又因為WinCE不驗證電池驅動(dòng)返回的數據,因此不同的系統有不同的變化,這個(gè)函數返回來(lái)的數據是主要依賴(lài)于電池驅動(dòng)。例如,許多系統在使用AC電源時(shí)不報告精確的電源級數,另一些系統則相反。
(2)改變電源狀態(tài)
應用程序能通過(guò)一系列的方式改變系統的電源狀態(tài),在WinCE中首選的方式是使用電源管理程序。電源管理程序提供函數來(lái)允許應用程序來(lái)控制電源狀態(tài),如應用程序通過(guò)調用函數SetSystemPowerState來(lái)請求特定的電源狀態(tài)。一般有兩個(gè)方式來(lái)控制電源,第一個(gè)方式是應用程序給定一個(gè)電源設定;第二個(gè)方式是應用程序請求電源狀態(tài)不要低于給定的級別。
常見(jiàn)的例如:①關(guān)閉電源,應用程序通過(guò)調用GwesPowerOffSystem函數掛起系統,如函數void GwesPowerOffSystem(void)的調用就會(huì )掛起系統。② 關(guān)閉屏幕,如果系統是有色背光顯示,那么主要的電源消耗不是CPU而是背光。在某一些環(huán)境下,一個(gè)應用程序運行時(shí)并不需要顯示在屏幕上。例如音樂(lè )播放器應用程序,當用戶(hù)聽(tīng)音樂(lè )的時(shí)候不關(guān)注屏幕,在這些情形下關(guān)閉背光將意味著(zhù)提高電池壽命。當然,當用戶(hù)想看屏幕時(shí),任何關(guān)閉背光應用程序就需要一個(gè)簡(jiǎn)單的方式來(lái)重新打開(kāi)屏幕。顯示控制是通過(guò)Ext-Escape函數實(shí)現,這個(gè)函數允許應用程序打開(kāi)或關(guān)閉顯示。另外,WinCE沒(méi)有一個(gè)統一的方式來(lái)控制背光的亮度,每個(gè)系統都有它自己的OEM特有方式來(lái)控制背光亮度。③打開(kāi)系統電源,意思是說(shuō)當被掛起的應用程序要再次運行時(shí),必須要有一個(gè)方式來(lái)喚醒一個(gè)掛起的系統電源。方法可以是應用程序通過(guò)使用消息API(Notification API)把系統喚醒。在一般情況下,OEM廠(chǎng)商會(huì )分配一些中斷條件以便電源打開(kāi)或喚醒。
(3)防止系統關(guān)閉電源
另一方面,防止系統掛起也是一個(gè)重要的問(wèn)題。WinCE系統通常被設置為當一段時(shí)間沒(méi)有用戶(hù)輸入就自動(dòng)掛起。因此,如果定時(shí)器到達預先的沒(méi)有用戶(hù)輸入的間隔,系統會(huì )自動(dòng)掛起。當要防止自動(dòng)掛起時(shí),應用程序可以周期性地調用這個(gè)函數:void WINAPI SystemIdleTimerReset (void),這個(gè)函數能重設WinCE用來(lái)監視用戶(hù)輸入的定時(shí)器。所以當一個(gè)應用程序需要更改超時(shí)值時(shí),就可以通過(guò)調用SystemIdleTimerReset把掛起超時(shí)值改變。一般來(lái)說(shuō),WinCE系統維護三個(gè)超時(shí)值,防止電源被自動(dòng)掛起可以使用SystemParametersInfo來(lái)查詢(xún)這三個(gè)值,并在最短時(shí)間內返回調用SystemIdleTimerReset。如果超時(shí)值被設置為0,表示超時(shí)值被禁止。
(4)電源通知
最后,電源管理程序還有一個(gè)十分受歡迎的特點(diǎn),就是可以在系統電源狀態(tài)改變時(shí)通知應用程序,這可以讓?xiě)贸绦驈氖謩?dòng)檢測電源狀態(tài)中解脫出來(lái)。應用程序通過(guò)調用RequestPowerNotifications請求電源管理程序當電源狀態(tài)改變的時(shí)候,發(fā)送一個(gè)通知給應用程序,電源管理程序再通過(guò)一個(gè)由應用程序建立的消息隊列發(fā)送此通知。
總之,嵌入式電源管理在WinCE系統是一個(gè)快速發(fā)展的研究課題。它對移動(dòng)嵌入式產(chǎn)品的設計具有關(guān)鍵性影響,一個(gè)高效的電源管理設計可以幫助移動(dòng)嵌入式產(chǎn)品在市場(chǎng)競爭中脫穎而出,克敵制勝。
評論