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