<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          WinCE節(jié)能降耗新技巧:高效休眠喚醒

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

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

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


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();