免费色播,亚洲国产欧美国产第一区二区三区,毛片看,日本精品在线观看视频,国产成人精品一区二区免费视频,日本黄色免费网站,一级毛片免费

WinCE電源管理的實現(xiàn)

來源:網(wǎng)絡

點擊:1548

A+ A-

所屬頻道:新聞中心

關鍵詞: WinCE,電源管理

      電源管理的目的是節(jié)能,基本的節(jié)能方法是使系統(tǒng)適時的進出休眠狀態(tài)。比如用戶按下On/Off按鈕,或者監(jiān)視用戶活動的定時器超時,或者應用呼叫api都可以使得系統(tǒng)休眠,用戶再次按下On/Off或者其他喚醒中斷將使得系統(tǒng)退出休眠。從而可見,電源管理模塊和用戶活動情況密不可分,電源管理是用戶活動所驅動的。 WinCE中處理用戶與系統(tǒng)交互的部分是GWES,所以早期電源管理工作是由GWES來實現(xiàn)。( GWES:Graphics,Windows and Events Subsystem.圖形,窗口和事件子系統(tǒng)。主要負責圖形輸出和用戶交互)。 但GWES提供的電源管理模塊功能過于粗糙死板:所有子設備只能有On和Suspend狀態(tài),應用程序無法得到任何狀態(tài)轉換通知,等等……直到WinCE4.0才引入了電源管理模塊用以替代GWES中的電源管理功能。(進一步的,為了方便電源管理模塊的集中管理,還需要關閉原來GWES對電源管理功能。方法是注冊表HKLM\SYSTEM\CurrentControlSet\Control\Power設置DisableGwesPowerOff=1來禁止GWES插手電源管理。系統(tǒng)是默認禁止的。此外,一些用戶活動情況仍舊依賴GWES獲得,設置注冊表HKLM\system\GWE下的ActivityEvent=PowerManager/ActivityTimer/UserActivity.從而告訴GWES,當鼠標,鍵盤,觸摸屏等輸入發(fā)生時候,GWES要SetEvent這個全局事件以通知電源管理模塊。)

      新的電源管理模塊提供更完整和靈活的功能,系統(tǒng)電源可以自由靈活設定,子設備電源狀態(tài)可以單獨設定,應用可以獲得電源通知等等。

     ?。巯到y(tǒng)電源]

      OEM可以依據(jù)需要任意定義系統(tǒng)電源狀態(tài),比如On,ScreenOff,UserIdle,SystemIdle,Suspend等。系統(tǒng)電源狀態(tài)更多的是代表系統(tǒng)電源的一種配置方案,它是各個子設備電源配置的集合。它設定一種可能出現(xiàn)的情景,并且事先擬定了此情景下電力分配策略(哪些子設備打開,哪些子設備關閉)。比如,也許On可以代表常規(guī)工作的情景,所有子設備打開的狀態(tài); ScreenOff可以代表LCD被用戶請求關閉的情景,LCD背燈電源被關閉的狀態(tài); UserIdle可以代表用戶一段時間沒有操作的情景,cpu/soc將進入low power的狀態(tài); Suspend可以代表設備空閑很久了可以掛起的情景,所有非必要供電的子設備電源關閉的狀態(tài);等等…系統(tǒng)的電源狀態(tài)的定義很靈活而且自由。 可以在注冊表定義系統(tǒng)電源狀態(tài)。比如:

     ?。跦KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\State\On]

      “Default”=dword:0 ; D0

      “Flags”=dword:10000 ; POWER_STATE_ON

      上面定義了On狀態(tài),F(xiàn)lags是附加的狀態(tài)信息(hints),對應pm.h中的宏定義POWER_STATE_ON.defaule表示在這個狀態(tài)下所有子設備的默認狀態(tài)。

      電源管理模塊的重點之一是制訂系統(tǒng)電源管理策略,這包括定義系統(tǒng)電源狀態(tài),決定狀態(tài)間轉換的條件。以默認的版本為例子:

      On:用戶與系統(tǒng)交互時候的狀態(tài)。

      UserIdle: 代表用戶停止輸入,但可能仍然在使用的情景,比如閱讀文件。

      SystemIdle: 代表用戶停止使用設備,但處理器仍然工作的情景,比如,后臺文件傳輸。

      Suspend: 代表休眠狀態(tài)。

      用戶在使用時候,系統(tǒng)處于On狀態(tài),用戶停止輸入,系統(tǒng)自動轉入UserIdle狀態(tài),持續(xù)沒有輸入時間后,進入SystemIdle狀態(tài),持續(xù)一段時間后,系統(tǒng)將自動進入Suspend狀態(tài)。應用程序也可以調(diào)用SetSystemPowerState()來進行狀態(tài)切換。

      在這個基礎上,根據(jù)自己的平臺特點,增加新的策略就基本可以滿足常規(guī)產(chǎn)品需要。

      1. On/Off按鍵。 (A)。電源管理模塊已經(jīng)支持了電源按鍵功能,最直接的辦法可以在pdd中增加電源按鍵定義,按鍵io的初始化,檢測等等,(B)。從外部發(fā)送消息給電源管理模塊來通知按鍵事件。(C)。使用api直接轉換狀態(tài)。即不使用電源管理模塊提供的按鍵功能,直接調(diào)用SetSystemPowerState使得系統(tǒng)進入Suspend狀態(tài)。這是很常見的做法,我們設計一個電源按鍵的流驅動,檢測到按鍵時候,呼叫api將系統(tǒng)電源轉換到Suspend.

      2. 加入背燈控制。比如在On狀態(tài)下打開請求顯示驅動打開背燈,在UserIdle和SystemIdle狀態(tài)下請求顯示驅動關閉背燈。

     ?。墼O備電源]

      支持電源管理的設備驅動的實現(xiàn),存在有大量的例子。簡單介紹如下:

      電源管理模塊并不直接實現(xiàn)對子設備的電源開關控制,子設備的電源控制是由各個設備驅動來控制的。電源管理模塊透過設備驅動的IOCTLs來請求設備控制自身電源。系統(tǒng)電源狀態(tài)是靈活自由設定的,而設備電源狀態(tài)是固定的,最多有5個:D0,D1,D2,D3,D4代表Full on,Low on, Standby, Sleep, Off這5個狀態(tài)。

      不是所有的設備驅動都支持電源管理(至少,在電源管理出現(xiàn)前的早期的設備驅動不會支持)。電源管理模塊對設備驅動提出了一個規(guī)范和架構,滿足規(guī)范的驅動納入電源管理。對于流驅動控制的設備,要支持電源管理要滿足的條件,簡單來說有:1.聲明自己是支持電源管理的(Iclass值).2.驅動中實現(xiàn)電源管理模塊所要求的IOCTLs.3.驅動加載時候要匯報所支持的電源狀態(tài)和相關特征.4.***_PowerDown和***_PowerUp接口接收系統(tǒng)休眠和喚醒通知。此外,設計驅動還應該了解:設備不一定具備所有5種狀態(tài),但至少可以工作在D0;電源管理模塊可能會要求設備進入任何設備電源狀態(tài),并不僅僅是設備所匯報自己支持的那幾個;如果被要求進入不支持的狀態(tài),應該進入另一個它所支持的更高功耗的狀態(tài);當前狀態(tài)不需要重復設置;設備電源狀態(tài)不一定和系統(tǒng)的電源狀態(tài)同步。除了流驅動外,還有許多內(nèi)建驅動需要支持電源管理功能。簡單總結:1.顯示驅動通過ExtCode接口(SETPOWERMANAGEMENT命令,類似IOCTLs)來控制顯示驅動的電源,還控制背燈.2鍵盤驅動的接口KeybdDriverPowerHandler.3.觸摸屏是TouchPanelPowerHandler.4.內(nèi)建網(wǎng)絡miniport驅動是MiniportReset接口.5.PCMCIA驅動是PowerUp和PowerDown.還有打印機,紅外等一些內(nèi)建驅動。

      [OAL對電源管理的支持]

     ?。巯到y(tǒng)的 idle狀態(tài)]

      當沒有線程準備運行時候,內(nèi)核就調(diào)用OEMIdle()。這個函數(shù)在bsp中,可以由OEM來修改定制。一般我們在這個函數(shù)里面會要求cpu進入low power狀態(tài)節(jié)省電流消耗。一般的cpu/soc都提供了對應idle的睡眠模式。當中斷發(fā)生或者喚醒事件發(fā)生時候,要保證cpu快速離開idle狀態(tài),返回運行狀態(tài)。

      系統(tǒng)idle狀態(tài)和前面說的UserIdle狀態(tài)是不同概念,前者是cpu負荷情況驅動,代表系統(tǒng)空閑;后者是用戶活動驅動,代表用戶空閑。

      一個OEMIdle()的推薦流程:

      根據(jù)dwReschedTime變量來計算下次喚醒時間

      判斷sleep類型,假如需要,調(diào)整喚醒時間

      Idle處理器和時鐘

      中斷發(fā)生

      判斷喚醒源

      更新CurMSec, idle計數(shù)值。

     ?。巯到y(tǒng)suspend狀態(tài)]

      當用戶按下OFF按鈕或者應用調(diào)用api進入suspend狀態(tài)時候,內(nèi)核會調(diào)用OEMPowerOff()函數(shù)。在OEMPowerOff()函數(shù)里面實現(xiàn)系統(tǒng)掛起,并且系統(tǒng)喚醒后繼續(xù)從OEMPowerOff()被掛起處執(zhí)行。 OEMPowerOff()時候要進入睡眠模式,睡眠模式根據(jù)cpu芯片的sleep模式來選擇,要選擇最低功耗的模式。如果cpu芯片提供的最低功耗模式是PowerDown模式,處理工作比較復雜,因為喚醒后是從reset處開始執(zhí)行,要恢復掛起時候的環(huán)境,使得應用程序不知道自己被掛起過。一般按照這樣流程來處理:關屏,清framebuffer, 保存必須的寄存器到內(nèi)存, 設置io, 保存通用寄存器, 保存wakeup地址, 靜止中斷,清除cache, 使能喚醒源中斷, 設置sdram自刷新, cpu進入PowerDown. 喚醒后的流程相反即可。 對于PowerDown模式之外的其他模式,比如慢時鐘模式, 處理則簡單很多,最重要的是設置喚醒源(一般是任何中斷可喚醒), sdram進入自刷新狀態(tài)。

      [SDRAM的控制]

      SDRAM的耗電比較大,一般是系統(tǒng)里面除了lcd背光外,sdram是最大的電力消耗設備。常見有mobile sdram和normal sdram這2種,mobile sdram相對于normal sdram增加了溫度補償自刷新,局部陣列自刷新,深度休眠特性,更加適合功耗限制設備,(但mobile sdram工作在更低電壓(1.8~2.5v),我想,對有些3.3v總線的cpu未必適合,因為總線會增加很多電平轉換的電路。)

      在OEMPowerOff()函數(shù)里面,保存好當前環(huán)境到sdram,然后使得sdram進入自刷新狀態(tài),cpu就可以進入最低功耗的sleep模式。喚醒后需要退出自刷新狀態(tài)。

      [應用層于電源管理]

      電源管理模塊也提供了應用層接口,使得應用程序也可以參與到電源管理。

      應用層可以通過SetSystemPowerState()來設置系統(tǒng)電源狀態(tài),可以通過SetDevicePower來設置子設備電源狀態(tài),可以通過SetPowerRequirement通知電源管理模塊將子設備設置在特殊電源狀態(tài)下,不隨系統(tǒng)電源改變。此外,電源管理還提供了消息隊列,應用層還可以通過RequestPowerNotifications函數(shù)請求電源管理模塊發(fā)送相關消息(PBT_RESUME, PBT_POWERSTATUSCHANGE, PBT_TRANSITION, PBT_POWERINFOCHANGE)。

      設計應用程序也許有幾點值得考慮:不要無謂占用cpu,盡可能快的讓出cpu.比如一個很小的動畫,哪怕只占1%的cpu也會導致一些系統(tǒng)無法進入低功耗。這里是2點建議:(1)當應用不在foreground時候,停止占用cpu.(2)用戶沒有和應用交互時候,停止應用對cpu的占用。另外一些應用也許是相反情況的,播放媒體文件時候,當開始播放時候,不希望自動進入suspend模式??梢裕?)每隔一些時間就reset一次定時器。(2)或者設置所有定時器為0,停止電源管理(tcpmp就是這樣的)。

     ?。垭娫垂芾淼南到y(tǒng)實現(xiàn)]

      電源管理模塊實體是一個動態(tài)鏈接庫pm.dll來實現(xiàn)的??梢栽趐b的catalog窗口中選擇電源管理組件添加到os中。如下圖,微軟提供了2個選擇(二選一)。第一個代表完整功能,所有api全功能實現(xiàn),第二個代表空實現(xiàn)(形式上提供接口,但空函數(shù))。

      電源管理模塊的代碼結構是分層的,MDD PDD.MDD是抽象公共庫,不需要改動,PDD是平臺相關,主要改動都在PDD.針對平臺特性,微軟提供了2種類型PDD示例。一種是default,另外一種是pda版本的。默認的情況,使用的是default.如果要使用pda版本的,需要在系統(tǒng)中指定環(huán)境變量SYSGEN_PM_PDA. default和pda版本的主要區(qū)別:

      default版本定義了4種狀態(tài):On, UserIdle, SystemIdle, Suspend;

      PDA版本定義了On, ScreenOff, Unattended, Resume, Suspend.

      default版本的簡單描述:UserIdle狀態(tài)是描述用戶在使用但沒有操作,比如閱讀.SystemIdle狀態(tài)描述用戶停止使用,但系統(tǒng)仍然工作,比如文件傳輸。

      PDA版本簡單描述:ScreenOff狀態(tài)描述用戶請求把屏幕背燈關閉。是用戶主動關閉的情況,區(qū)別于UserIdle,UserIdle是自動的.Unattended狀態(tài)表示后臺工作,用戶不會對其察覺的情景,比如ActiveSync每5分鐘喚醒系統(tǒng)同步,然后繼續(xù)suspend; Resume狀態(tài)描述喚醒后情景,比如喚醒后在指定時間內(nèi)決定轉到哪個狀態(tài),否則繼續(xù)suspend.

      [定制電源管理模塊的方法]

      Pm.dll是由device.exe加載的,首先device.exe當然是必須的,在pb的catalog中檢查Device Manager組件,或者檢查SYSGEN_DEVICE變量。其次,仍舊應該選擇上圖的電源管理組件power management full.

      方案一(推薦方案):在bsp的驅動目錄中新建一個pm目錄,在這里完成電源管理模塊PDD部分的實現(xiàn),并鏈接MDD最終生成一個pm.dll替代原來系統(tǒng)的pm.dll.

      PDD參考微軟提供的代碼platform.cpp,主要修改是增加狀態(tài)轉換的動作執(zhí)行單元。

      方案二:完全不修改電源管理部分,因為默認的PDD在狀態(tài)轉換時候雖然沒有動作,但是廣播了PBT_TRANSITION消息,可以截獲這個消息來進行狀態(tài)轉換。這樣作法不如方案一直接。如果是進程實現(xiàn),還浪費一個寶貴進程資源。

     ?。塾绊懴到y(tǒng)功耗各方面考慮]

      1.系統(tǒng)時鐘周期

      典型的WinCE系統(tǒng)時鐘周期是1ms,增加時鐘周期有助進一步降低設備功耗。在OEMInit()àOALTimerInit()修改系統(tǒng)時鐘。

      2.可變系統(tǒng)時鐘節(jié)拍Variable Tick Scheduler

      典型設計里wince每毫秒產(chǎn)生系統(tǒng)時鐘中斷,那么每隔1ms都會使得idle退出,如果發(fā)現(xiàn)沒有線程就緒時候繼續(xù)idle. 對有功耗限制的設計,可以考慮改變系統(tǒng)時鐘節(jié)拍后進入idle狀態(tài)。這樣在預期的時間段里,idle狀態(tài)不會被無謂的系統(tǒng)時鐘中斷喚醒。

      3.LCD背燈的調(diào)節(jié)策略

      早期的設計使用一個獨立的驅動來實現(xiàn)背燈的控制和調(diào)節(jié)策略。簡單介紹背燈驅動原理:背燈驅動啟動一個監(jiān)視工作線程,不停等待3個事件:

      1. BackLightChangeEvent

      2. PowerChangedEvent(供電電源發(fā)生變化,比如插手了AC電源,會獲得了這個事件)

      3. PowerManager/ActivityTimer/UserActivity(用戶輸入事件)

      從注冊表中讀取超時值,當超時事件發(fā)生,則將系統(tǒng)背燈關閉。背燈關閉期間,用戶重新活動時候,發(fā)生第3個事件,則打開背燈。注冊表的超時值決定了背燈工作時間。類同pc上設置屏幕保護時間。此外,背燈驅動也需要提供對系統(tǒng)電源狀態(tài)切換的支持.power down時候要關閉背燈,power up時候打開背燈。

      電源管理模塊可以定義一種系統(tǒng)電源狀態(tài)來描述背燈關閉的情景(比如在UserIdle或者ScreenOff狀態(tài)時候關閉背燈,On狀態(tài)時候打開背燈)所以,背燈驅動可以被取消。

      4.IO口的漏電流

      空載IO避免設置成為輸入口,考慮懸空輸入導致門電路開關,造成電流消耗。負載IO依照情況設定,一般設置輸出低。

      5.電池驅動

      電池驅動最主要的功能是監(jiān)視系統(tǒng)電力。它提供了其他模塊和應用對系統(tǒng)電源狀態(tài)的查詢,查詢是AC,還是battary供電,查詢電池電量等.

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡及各大主流媒體。版權歸原作者所有。如認為內(nèi)容侵權,請聯(lián)系我們刪除。