伴隨著嵌入式產品的普及,電源管理開發和設計成為了嵌入式系統開發的重點和重要部分。因為嵌入式裝置對能耗越來越敏感,而電源管理技術正是這些產品設計的關鍵所在。目前嵌入式系統的電源管理技術正由傳統的基於電源管理器件和外設控製為主的靜態控制方式,轉到以作業系統為核心的動靜態結合的綜合控制模式。
為了應對電源管理面臨的挑戰,在嵌入式系統開發在時需要設計多種電源模式,以便在不同工作狀態時有多種能耗模式可供選擇。休眠和喚醒功能正是目前WINCW系統開發的研究熱點之一。那麼,休眠喚醒功能是什麼原理呢?它能達到什麼樣的效果。這首先要從硬體說起,當系統進入睡眠模式後,整個系統會進入低功耗睡眠模式,只有當外部中斷中任意一個中斷被觸發或者系統時鐘中斷被觸發時,系統才會被喚醒。
一.什麼是休眠喚醒功能?
(1)什麼是WinCE休眠喚醒功能?
在WinCE系統中支援多種電源狀態:①ON狀態,使用者在主動使用裝置。②UserIdle狀態,使用者與裝置停止互動,但仍有可能使用裝置。③SystemIdle狀態,在經過一段時間的 UserIdle後進入此狀態,但是驅動和系統仍然活動。④Suspend狀態,當驅動程式和系統進程不再與系統互動時進入此狀態。 ⑤ColdReboot和Reboot狀態,冷啟動後系統電源狀態。其中,按功率消耗由小到大可分為睡眠(sleep)、空閑(idle)、運行(Run)等模式。大多時間內,在運行態(Run)時裝置全部正常工作,而在睡眠與空閑模式時系統則是按照特定的模式進行相應的節能。
通常,嵌入式系統在大多數時間都不需要關注WinCE 裝置的電源損耗,但是在某些時候要注意這些損耗。因此,最好的節能方法是使系統適時的進出休眠狀態。例如,WinCE系統先檢查任務負載情況,如果沒有需要啟動並執行任務,則一般進入空閑節能狀態等待喚醒,在空閑一段時間後再進入深度睡眠,掛起到RAM中或者硬碟上。當WinCE 系統被掛起,為了省電系統需要關閉CPU處理器及大部分裝置的供電,然後在需要喚醒時再通過定時器或中斷模組喚醒。比如使用者按下On/Off按鈕時,或者監視使用者活動的定時器逾時,或者應用程式 API都可以使得嵌入式系統休眠。而當使用者再次按下On/Off或者有其它喚醒中斷髮生時,系統核心調用OEMPowerOff()函數,在系統喚醒後繼續從OEMPowerOff()被掛起處執行。OEMPowerOff函數能進行CPU寄存器儲存、設定及喚醒恢複等功能。系統Idle狀態和前面說的UserIdle狀態是不同概念,前者是CPU負荷驅動,代表系統空閑;後者是使用者活動驅動,代表使用者空閑。
(2)休眠喚醒功能的具體內容
一般來說,WINCE電源狀態有六種狀態,分別是S0到S5:S0實際上這就是我們平常的工作狀態,所有裝置全開;S1也稱為POS(Power on Suspend),這時除了通過CPU時鐘控制器將CPU關閉之外,其它的組件仍然正常工作;S2這時CPU處於停止運作狀態,匯流排時鐘也被關閉,但其餘的裝置仍然運轉;S3這就是我們熟悉的STR(Suspend
to RAM);S4也稱為STD(Suspend to Disk),這時系統主電源關閉,但是硬碟仍然帶電並可以被喚醒;S5這種狀態是最乾脆的,就是連電源在內的所有裝置全部關閉,即關機(Shutdown)。
WINCE電源管理休眠和喚醒可實現以下功能:使用者可以使外設在指定時間開關,或作業系統可以根據具體需求來分配電能源,或在無人使用時可以使系統進入休眠狀態,但保證一些通訊裝置開啟。也就是說,嵌入式系統能夠管理閑置的裝置,關閉裝置並提供恢複手段,主要支援三種節電方式:①Suspend即掛起,顯示屏自動關閉,只是主機通電。這時敲任意鍵即可恢複原來狀態。②Suspend
to Ram 即掛起到記憶體,系統把當前資訊儲存在記憶體中,只有記憶體等幾個關鍵組件通電,這時系統處在高度節電狀態,按任意鍵後系統從記憶體中讀取資訊很快恢複到原來狀態。③Suspend to Disk即掛起到硬碟,即系統將自動關機,關機前將當前資料存放區在硬碟上,使用者下次按開關鍵開機時電腦將無須啟動系統,直接從硬碟讀取資料,恢複原來狀態。
在嵌入式系統中,我們最常用到的是S3狀態,即Suspend to RAM(掛起到記憶體)狀態。顧名思義,STR就是把系統進入STR前的工作狀態資料都存放到記憶體中去。在STR狀態下,電源仍然繼續為記憶體等最必要的裝置供電,以確保資料不丟失,而其它裝置均處於關閉狀態,系統的耗電量極低。一旦我們按下Power按鈕系統就被喚醒,馬上從記憶體中讀取資料並恢複到STR之前的工作狀態。記憶體的讀寫速度極快,因此我們感到進入和離開STR狀態所花費的時間不過是幾秒鐘而已。而S4狀態即STD(掛起到硬碟)與STR的原理是完全一樣的,只不過資料是儲存在硬碟中。由於硬碟的讀寫速度比記憶體要慢得多,因此用起來也就沒有STR那麼快了,但STD模式是一種更省電的進階應用程式,是將當前系統狀態儲存到硬碟後,硬碟隨即停止轉動系統進入低功耗狀態。當再開機時系統會跳過自檢,直接從硬碟恢複原來的系統狀態,而不是正常系統的預設狀態,從而縮短了開機
二.休眠功能的具體實現過程
WinCE休眠可以理解為待機,是把系統的功耗降到最低,但不是關機。讓WinCE系統進入休眠的方法有很多,如在應用程式或驅動中調用SetSystemPowerState函數。一般來說,對於支援電源管理的驅動,系統會調用此驅動的XXX_PowerDown介面來關閉裝置電源,之後系統會再調用OEMPowerOff()函數來實現。OEMPowerOff()函數由OEM來完成,這個函數也許會位於 Power.c或者Off.c的檔案中。OEMPowerOff()是由OEM來實現的,其代碼和流程也許不同,但基本按照下面的方法來完成:
(1)先進行休眠前平台相關的動作
這些相關的平台動作包括:為睡眠模式設定合理的GPIO,合理配置系統時鐘在內的喚醒源,調用BSPPowerOFF關閉休眠時不必要的裝置電源。比如清屏、設定AD、掛起USB等。還包括儲存晶片所有的寄存器值到一個靜態數組(就是堆棧中),比如將休眠返回地址或一些不希望在睡眠模式下丟失的資料進行儲存。最後,是調用 CPULCDOff函數來關閉LCD背光。
(2)調用 ConfigStopGPIO,設定各IO休眠後的狀態
這個動作是指儲存當前GPIO和LCD控制器等資訊在記憶體中,設定GPIO為低功耗狀態,關閉kitl LCD等裝置。同時,呼叫OALCPUPowerOff()進行掛起。OALCPUPowerOff()是一個位於Startup.s中的彙編函數。通常還包括儲存通用寄存器的值到堆棧,如儲存Wakeup後的地址、MMU寄存器,並進入各模式將sp和lr寄存器儲存到記憶體RAM的某一個位置,這個位置是由config.bib指定保留的。至於為什麼不象之前一樣儲存到堆棧呢?是因為系統喚醒後跳轉到Reset開始執行,這時候堆棧還沒有初始化,這也是Poweroff過程複雜的原因。
(3)屏蔽所有中斷,清理Cache
在設定好各IO的休眠狀態後,系統會在中斷屏蔽寄存器中屏蔽所有中斷,然後再清理Cache,做好休眠前的準備。
(4)設定喚醒中斷,調用 CPUPowerOff
一般來說,喚醒中斷可以是外部中斷0,1,2,或者RTC中斷。在設定好喚醒中斷後,系統需要再調用OALCPUPowerOff,並設定REFRESH讓SDRAM進入自重新整理模式,然後等待SDRAM自重新整理有效,並設定 MISCCR使 SDRAM 的訊號 (SCLK0,SCLK1 and SCKE) 在 Power_OF 模式下被保護,設定CLKCON進入Power_OFF模式,最終CPU進入Poweroff狀態。但因為關機最終也會調到OEMPOWEROFF函數,所以在此函數中到底去休眠還是關機就要自己根據實際情況區分一下了。而且在這個過程中,最容易出問題的部分是調用OALCPUPowerOff的過程中,這是由於CPU在休眠期間是會掉電的。
三.喚醒功能的具體實現流程
在休眠狀態,WINCW系統中消耗的能源會大幅度降低。那麼接下來,就是另一個艱巨的任務了:系統喚醒。喚醒系統基本上是個硬體過程,它和硬體緊密相關。一般是用一個外部中斷來喚醒,這就要求休眠的時候這個中斷源不能斷電。一般來說,驅動程式裡都已經做好了PowerUp和PowerDown,當然也有些驅動裡有不同的處理,如使用PowerOn和PowerOff。但不論何種方式Reset,都是先執行Bootloader的代碼,所以喚醒過程需要 Bootloader的參與配合。詳細的實現流程如下:
(1)通過喚醒源喚醒系統,產生內部複位訊號
當我們細心觀看 WINCE系統由SLEEP到NORMAL的切換時,中間要經過一個 RESET的過程,這個過程稱之為 Power On Reset。也就是說,當系統被外部中斷喚醒時,相當於發生了一次Power Reset的過程。那麼喚醒系統,就類似於給系統做了一個硬體複位,並會在GSTATUS2中儲存一個數值來表明Reset的原因。而且,Power On Reset後,在之前Sleep過程中儲存下來的RAM裡的系統資料是不會丟失的。我們要做的喚醒系統,就是把這些數值恢複到它原來的地址裡去。
(2)測試是否是Power_OFF模式喚醒
當WINCE系統喚醒之後,它啟動並執行第一段程式是什麼呢?這點很重要,因為喚醒=Power Reset,所以Reset CPU之後,運行第一段程式自然就是Bootloader了。現在我們再看看Bootloader是怎麼處理的,如果是Reset複位就會直接跳轉到0地址,也就是ResetHandler去執行。事實上,無論是HardReset還是PowerReset這個部分都要執行,主要是做初始化CPU時鐘的工作。這是因為Power off模式和其它睡眠模式不同,其它的睡眠模式喚醒後會從睡眠處繼續運行,而Power
off模式喚醒後是從Reset處執行。
接下來,系統會通過讀取 GSTATUS2 寄存器裡的數值,來判斷Reset的原因。如果這個值是0x2,那麼就是喚醒引起的PowerReset,然後會繼續向下執行喚醒的恢複操作。例如,先是恢複CPU的時鐘,開啟RAM的自重新整理,再跳轉到 RAM中的一個地址去執行Bootloader,然後把NandFlash裡的資料裝載完畢,也就是說WINCE的作業系統被喚醒了。如果判斷GSTATUS2裡的數值是0x4,則說明發生了看門狗Reset,那麼就要執行看門狗Reset的恢複過程。如果二者都不是的話,那麼就認為是發生了Hard
Reset,就要按照正常的步驟去載入Wince系統。
(3)恢複SDRAM控制器資訊,開啟相關裝置電源
系統喚醒的最後一個步驟,是系統會設定MISCCR,釋放SDRAM訊號保護,然後等待直到SDRAM自重新整理釋放。並讀取GSTATUS值,利用它們回複到睡眠前的程式位置。最後是恢複儲存在記憶體中的GPIO和LCD控制器等資訊,並調用BSPPowerOn開啟相關裝置電源,然後返回。
轉載出處