<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 電源與新能源 > 設計應用 > WinCE節能降耗新技巧:高效休眠喚醒

WinCE節能降耗新技巧:高效休眠喚醒

作者: 時(shí)間:2011-09-07 來(lái)源:網(wǎng)絡(luò ) 收藏

伴隨著(zhù)嵌入式產(chǎn)品的普及,電源管理開(kāi)發(fā)和設計成為了嵌入式系統開(kāi)發(fā)的重點(diǎn)和重要部分。因為嵌入式設備對能耗越來(lái)越敏感,而電源管理技術(shù)正是這些產(chǎn)品設計的關(guān)鍵所在。目前嵌入式系統的電源管理技術(shù)正由傳統的基于電源管理器件和外設控制為主的靜態(tài)控制方式,轉到以操作系統為核心的動(dòng)靜態(tài)結合的綜合控制模式。

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


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>