WinCE電源管理的簡單介紹

來源:互聯網
上載者:User
 

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

新的電源管理模組提供更完整和靈活的功能,系統電源可以自由靈活設定,子裝置電源狀態可以單獨設定,應用可以獲得電源通知等等.

[系統電源]

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

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/State/On]

"Default"=dword:0 ; D0

"Flags"=dword:10000 ; POWER_STATE_ON

上面定義了On狀態,Flags是附加的狀態資訊(hints),對應pm.h中的宏定義POWER_STATE_ON.defaule表示在這個狀態下所有子裝置的預設狀態.

電源管理模組的重點之一是制訂系統電源管理策略,這包括定義系統電源狀態,決定狀態間轉換的條件.以預設的版本為例子,簡單圖示如下:

子,簡單圖示如下:

On:使用者與系統互動時候的狀態.

UserIdle: 代表使用者停止輸入,但可能仍然在使用的情景,比如閱讀檔案.

SystemIdle: 代表使用者停止使用裝置,但處理器仍然工作的情景,比如,後台檔案傳輸.

Suspend: 代表休眠狀態.

使用者在使用時候,系統處於On狀態,使用者停止輸入,系統自動轉入UserIdle狀態,持續沒有輸入時間後,進入SystemIdle狀態,持續一段時間後,系統將自動進入Suspend狀態.應用程式也可以調用SetSystemPowerState()來進行狀態切換.

在這個基礎上,根據自己的平台特點,增加新的策略就基本可以滿足常規產品需要.

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

2. 加入背燈控制.比如在On狀態下開啟請求顯示驅動開啟背燈,在UserIdle和SystemIdle狀態下請求顯示驅動關閉背燈.

[裝置電源]

支援電源管理的裝置驅動的實現,存在有大量的例子.簡單介紹如下:

電源管理模組並不直接實現對子裝置的電源開關控制,子裝置的電源控制是由各個裝置驅動來控制的.電源管理模組透過裝置驅動的IOCTLs來請求裝置控制自身電源.系統電源狀態是靈活自由設定的,而裝置電源狀態是固定的,最多有5個:D0,D1,D2,D3,D4代表Full on,Low on, Standby, Sleep, Off這5個狀態.

不是所有的裝置驅動都支援電源管理(至少,在電源管理出現前的早期的裝置驅動不會支援).電源管理模組對裝置驅動提出了一個規範和架構,滿足規範的驅動納入電源管理.對於流驅動控制的裝置,要支援電源管理要滿足的條件,簡單來說有:1.聲明自己是支援電源管理的(Iclass值).2.驅動中實現電源管理模組所要求的IOCTLs.3.驅動載入時候要彙報所支援的電源狀態和相關特徵.4.***_PowerDown和***_PowerUp介面接收系統休眠和喚醒通知.此外,設計驅動還應該瞭解:裝置不一定具備所有5種狀態,但至少可以工作在D0;電源管理模組可能會要求裝置進入任何裝置電源狀態,並不僅僅是裝置所彙報自己支援的那幾個;如果被要求進入不支援的狀態,應該進入另一個它所支援的更高功耗的狀態;目前狀態不需要重複設定;裝置電源狀態不一定和系統的電源狀態同步.除了流驅動外,還有許多內建驅動需要支援電源管理功能.簡單總結:1.顯示驅動通過ExtCode介面(SETPOWERMANAGEMENT命令,類似IOCTLs)來控制顯示驅動的電源,還控制背燈.2鍵盤驅動的介面KeybdDriverPowerHandler.3.觸控螢幕是TouchPanelPowerHandler.4.內建網路miniport驅動是MiniportReset介面.5.PCMCIA驅動是PowerUp和PowerDown.還有印表機,紅外等一些內建驅動.

[OAL對電源管理的支援]

[系統的 idle狀態]

當沒有線程準備運行時候,核心就調用OEMIdle().這個函數在bsp中,可以由OEM來修改定製.一般我們在這個函數裡面會要求cpu進入low power狀態節省電流消耗.一般的cpu/soc都提供了對應idle的睡眠模式.當中斷髮生或者喚醒事件發生時候,要保證cpu快速離開idle狀態,返回運行狀態.

系統idle狀態和前面說的UserIdle狀態是不同概念,前者是cpu負荷情況驅動,代表系統空閑;後者是使用者活動驅動,代表使用者空閑.

一個OEMIdle()的推薦流程:

根據dwReschedTime變數來計算下次喚醒時間

判斷sleep類型,假如需要,調整喚醒時間

Idle處理器和時鐘

中斷髮生

判斷喚醒源

更新CurMSec, idle計數值.

[系統suspend狀態]

當使用者按下OFF按鈕或者應用調用api進入suspend狀態時候,核心會調用OEMPowerOff()函數.在OEMPowerOff()函數裡面實現系統掛起,並且系統喚醒後繼續從OEMPowerOff()被掛起處執行. OEMPowerOff()時候要進入睡眠模式,睡眠模式根據cpu晶片的sleep模式來選擇,要選擇最低功耗的模式.如果cpu晶片提供的最低功耗模式是PowerDown模式,處理工作比較複雜,因為喚醒後是從reset處開始執行,要恢複掛起時候的環境,使得應用程式不知道自己被掛起過.一般按照這樣流程來處理:關屏,清framebuffer, 儲存必須的寄存器到記憶體, 設定io, 儲存通用寄存器, 儲存wakeup地址, 靜止中斷,清除cache, 使能喚醒源中斷, 設定sdram自重新整理, cpu進入PowerDown. 喚醒後的流程相反即可. 對於PowerDown模式之外的其他模式,比如慢時鐘模式, 處理則簡單很多,最重要的是設定喚醒源(一般是任何中斷可喚醒), sdram進入自重新整理狀態.

[SDRAM的控制]

SDRAM的耗電比較大,一般是系統裡面除了lcd背光外,sdram是最大的電力消耗裝置.常見有mobile sdram和normal sdram這2種,mobile sdram相對於normal sdram增加了溫度補償自重新整理,局部陣列自重新整理,深度休眠特性,更加適合功耗限制裝置,(但mobile sdram工作在更低電壓(1.8~2.5v),我想,對有些3.3v匯流排的cpu未必適合,因為匯流排會增加很多電平轉換的電路.)

在OEMPowerOff()函數裡面,儲存好當前環境到sdram,然後使得sdram進入自重新整理狀態,cpu就可以進入最低功耗的sleep模式.喚醒後需要退出自重新整理狀態.

[應用程式層於電源管理]

電源管理模組也提供了應用程式層介面,使得應用程式也可以參與到電源管理.

應用程式層可以通過SetSystemPowerState()來設定系統電源狀態,可以通過SetDevicePower來設定子裝置電源狀態,可以通過SetPowerRequirement通知電源管理模組將子裝置設定在特殊電源狀態下,不隨系統電源改變.此外,電源管理還提供了訊息佇列,應用程式層還可以通過RequestPowerNotifications函數請求電源管理模組發送相關訊息(PBT_RESUME, PBT_POWERSTATUSCHANGE, PBT_TRANSITION, PBT_POWERINFOCHANGE).

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

[電源管理的系統實現]

電源管理模組實體是一個動態連結程式庫pm.dll來實現的.可以在pb的catalog視窗中選擇電源管理組件添加到os中.如,微軟提供了2個選擇(二選一).第一個代表完整功能,所有api全功能實現,第二個代表空實現(形式上提供介面,但空函數).

電源管理模組的代碼結構是分層的,MDD+PDD.MDD是抽象公用庫,不需要改動,PDD是平台相關,主要改動都在PDD.針對平台特性,微軟提供了2種類型PDD樣本.一種是default,另外一種是pda版本的.預設的情況,使用的是default.如果要使用pda版本的,需要在系統中指定環境變數SYSGEN_PM_PDA. default和pda版本的主要區別:

default版本定義了4種狀態:On, UserIdle, SystemIdle, Suspend;

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

default版本的簡單描述:UserIdle狀態是描述使用者在使用但沒有操作,比如閱讀.SystemIdle狀態原因使用者停止使用,但系統仍然工作,比如檔案傳輸.

PDA版本簡單描述:ScreenOff狀態原因使用者請求把螢幕背燈關閉.是使用者主動關閉的情況,區別於UserIdle,UserIdle是自動的.Unattended狀態表示後台工作,使用者不會對其察覺的情景,比如ActiveSync每5分鐘喚醒系統同步,然後繼續suspend; Resume狀態原因喚醒後情景,比如喚醒後在指定時間內決定轉到哪個狀態,否則繼續suspend.

[定製電源管理模組的方法]

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

方案一(推薦方案):在bsp的驅動目錄中建立一個pm目錄,在這裡完成電源管理模組PDD部分的實現,並連結MDD最終產生一個pm.dll替代原來系統的pm.dll.

PDD參考微軟提供的代碼platform.cpp,主要修改是增加狀態轉換的動作執行單元.

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

[影響系統功耗各方面考慮]

1.系統時鐘周期

典型的WinCE系統時鐘周期是1ms,增加刻度有助進一步降低裝置功耗.在OEMInit()àOALTimerInit()修改系統時鐘.

2.可變系統時鐘節拍Variable Tick Scheduler

典型設計裡wince每毫秒產生系統時鐘中斷,那麼每隔1ms都會使得idle退出,如果發現沒有線程就緒時候繼續idle. 對有功耗限制的設計,可以考慮改變系統時鐘節拍後進入idle狀態.這樣在預期的時間段裡,idle狀態不會被無謂的系統時鐘中斷喚醒.

3.LCD背燈的調節策略

早期的設計使用一個獨立的驅動來實現背燈的控制和調節策略.簡單介紹背燈驅動原理:背燈驅動啟動一個監視背景工作執行緒,不停等待3個事件:

1. BackLightChangeEvent

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

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

從註冊表中讀取逾時值,當逾時事件發生,則將系統背燈關閉.背燈關閉期間,使用者重新活動時候,發生第3個事件,則開啟背燈.註冊表的逾時值決定了背燈工作時間.類同pc上設定螢幕保護裝置時間.此外,背燈驅動也需要提供對系統電源狀態切換的支援.power down時候要關閉背燈,power up時候開啟背燈.

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

4.IO口的漏電流

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

5.電池驅動

電池驅動最主要的功能是監視系統電力.它提供了其他模組和應用對系統電源狀態的查詢,查詢是AC,還是battary供電,查詢電池電量等.

 

 

附:WinCE裡面有關Resume狀態的一些介紹

When a resume occurs the kernel is the first to execute. A device will only resume from a halted state if an interrupt occurs and the CPU has been programmed to wake when an interrupt occurs.

To resume a device

  1. The kernel performs the following clean-up tasks before resuming normal scheduling:

    • If this is an SHx, it calls OEMFlushCache.
    • Calls InitClock to re-initialize timer hardware to a 1 ms tick.
    • Calls Filesys.exe with a power on notification.
    • Calls GWES with a power on notification.
    • Initializes the KITL interrupt if one is in use.
  2. Power manager then calls FileSystemPowerFunction with the (FSNOTIFY_POWER_ON) argument.
  3. On the resume, GWES performs the following tasks:
    • Restores video memory from RAM.
    • Powers on the Window Manager.
    • Sets the screen contrast.
    • Shows the Startup UI screen, if required.
    • Posts a message to the Taskbar to tell it the device has resumed by send a WM_POWERBROADCAST message with PBT_APMRESUMESUSPEND parameter.
    • Sends the same message to the User notification subsystem.
    • Triggers applications that have requested to be triggered on resume.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.