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