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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于S3C2440和Windows CE5.0的嵌入式設(shè)備休眠喚醒技術(shù)研究

          基于S3C2440和Windows CE5.0的嵌入式設(shè)備休眠喚醒技術(shù)研究

          作者: 時(shí)間:2010-10-22 來源:網(wǎng)絡(luò) 收藏

          系統(tǒng)應(yīng)用中降低功耗以提高續(xù)航能力是其設(shè)計(jì)的熱點(diǎn)[1]。在狀態(tài),系統(tǒng)處于最低電流消耗狀態(tài),同時(shí)仍維持存儲(chǔ)區(qū)中的內(nèi)容,為了減少能量消耗和延長電池壽命,需要讓處理器定期進(jìn)入或退出模式[2]。 CE 作為一個(gè)廣泛應(yīng)用于上的操作系統(tǒng),提供了完善的電源管理功能。其中,便是一個(gè)重要的功能。本文在結(jié)合硬件基礎(chǔ)上分析休眠過程,分別采用外部中斷和RTC中斷喚醒兩種方法實(shí)現(xiàn)了休眠喚醒,并給出了具體實(shí)現(xiàn)代碼。根據(jù)相應(yīng)喚醒需求,將這兩種方法應(yīng)用于北京化工大學(xué)診斷與自愈工程中心的一款基于CE 5.0的智能巡檢分析診斷儀,結(jié)果表明能準(zhǔn)確達(dá)到實(shí)際的設(shè)置要求,效果良好。
          1 休眠喚醒過程分析
          對(duì)于電源控制邏輯模塊, 有多種電源管理方案以針對(duì)須執(zhí)行的任務(wù)保持最優(yōu)的電源消耗。S3C2440 中的電源管理模塊對(duì)應(yīng) 4 種模式:NORMAL 模式、SLOW 模式、IDLE 模式和SLEEP模式。
            在SLEEP模式下,電源管理模塊關(guān)閉內(nèi)部電源,因此,CPU 和內(nèi)部邏輯模塊都沒有電源消耗,但除了此模式下的喚醒模塊。激活SLEEP模式需要2個(gè)獨(dú)立的電源,其中一個(gè)為喚醒模塊供電,另一個(gè)為包括CPU的其他邏輯模塊供電,并且可以由power on/off控制。在SLEEP模式下,給CUP和內(nèi)部邏輯單元供電的第二個(gè)電源被關(guān)閉,只有喚醒模塊是工作的。這種狀態(tài)下,可以通過外部中斷EINT[15:0]或定時(shí)器的RTC(real time control)中斷將系統(tǒng)從睡眠狀態(tài)中喚醒[3],如圖1所示。

          本文引用地址:http://www.ex-cimer.com/article/151411.htm

          在睡眠模式下,VDDi、VDDiam、VDDMPLL以及VDDUPLL會(huì)被關(guān)閉,其由PWREN引腳來控制,如PWREN信號(hào)被置位,VDDi和VDDiam則由一個(gè)外部變壓器供電。當(dāng)PWREN=0時(shí),VDDi和VDDiam被關(guān)閉。
           有多種方法可以使系統(tǒng)進(jìn)入休眠,例如在 CE的桌面上,點(diǎn)左下角的開始圖標(biāo),然后選擇 “掛起”;或者,在應(yīng)用程序或驅(qū)動(dòng)中調(diào)用SetSystemPowerState()函數(shù),都可以讓系統(tǒng)進(jìn)入休眠狀態(tài)。實(shí)際上,這兩種方法殊途同歸,最終都需要通過OEM層OEMPowerOff()函數(shù)依次調(diào)用BSPPowerOff()函數(shù),以關(guān)閉板級(jí)的相關(guān)電源,保存所有寄存器的值,關(guān)閉背光;調(diào)用 ConfigStopGPIO()函數(shù),設(shè)置各IO休眠后的狀態(tài);如果支持KITL,調(diào)用OALKitlPowerOff()函數(shù)關(guān)閉KITL功能;調(diào)用OALCPUPoweroff()函數(shù),使得CPU進(jìn)入休眠模式。OALCPUPoweroff()函數(shù)保存當(dāng)前系統(tǒng)的狀態(tài),把CPU上一些寄存器里的數(shù)據(jù)保存到RAM里去,然后禁止RAM自刷新的功能,加入喚醒中斷源,最后使CPU進(jìn)入休眠模式。當(dāng)CPU處于Sleep狀態(tài)時(shí),RAM不會(huì)斷電,這樣RAM中的數(shù)據(jù)就不會(huì)丟失,當(dāng)CPU被喚醒后使用RAM里的數(shù)據(jù)恢復(fù)系統(tǒng)。
           當(dāng)相應(yīng)的中斷源觸發(fā)時(shí),CPU就會(huì)被喚醒,電流消耗變大了,需要說明的是,此處僅喚醒CPU,之后才喚醒WINCE系統(tǒng)。當(dāng)系統(tǒng)由SLEEP到NORMAL切換期間需經(jīng)過一個(gè)RESET過程,這個(gè)過程稱為 Power On Reset 。在S3C2440 CPU中,寄存器GSTATUS2專門用以判斷發(fā)生Reset原因。Power On Reset后,在之前SLEEP過程中保存下來的RAM中的系統(tǒng)數(shù)據(jù)是不會(huì)丟失的。本文需要設(shè)計(jì)的喚醒子系統(tǒng),就是把這些數(shù)值恢復(fù)到它們休眠前應(yīng)處的地址。
           在Bootloader中實(shí)現(xiàn)數(shù)據(jù)恢復(fù)的具體步驟如下:
           (1)如果有喚醒源被觸發(fā),內(nèi)部的復(fù)位信號(hào)就會(huì)動(dòng)作。這和外部的 nReset引腳觸發(fā)非常相似。復(fù)位持續(xù)時(shí)間由內(nèi)部的 16 bit計(jì)數(shù)器邏輯決定,通過reset 復(fù)位決斷時(shí)間可以計(jì)算tRST=(65535/XTAL_frequency);
           (2)通過檢測(cè)GSTATUS2[2],判斷是否是由SLEEP模式喚醒引起的電源開啟;
           (3)通過設(shè)置 MISCCR[19:17]=000b,釋放 SDRAM 的信號(hào)保護(hù);
           (4)配置 SDRAM 內(nèi)存控制器;
           (5)等待,直到 SDRAM 自刷新被釋放,結(jié)束等待。大部分SDRAM需要等待所有 SDRAM 行的自刷新周期;
           (6)GSTATUS[3:4]的信息可用于保存用戶自定義數(shù)據(jù),因?yàn)樵?GSTATUS[3:4]中的值在睡眠模式下被保留;
           (7)對(duì) EINT[3:0],檢查 SRCPND 寄存器;對(duì)EINT[15:4],查看 EINTPEND 寄存器而不是SRCPND寄存器。(盡管EINTPEND寄存器的一些位被置位,SRCPND 寄存器不會(huì)被置位)。
           以上是一個(gè)通用的休眠喚醒過程,在實(shí)際應(yīng)用中,可根據(jù)不同情況使用不同的喚醒方式。例如,以休眠模式待機(jī),在需要使用儀器時(shí)才喚醒系統(tǒng)的情況下,就需要一個(gè)諸如按鍵的外部中斷來喚醒系統(tǒng);而對(duì)于僅做一個(gè)保存掛起動(dòng)作的情況,即刻自動(dòng)喚醒系統(tǒng)則更為便捷。S3C2440就提供了兩種喚醒實(shí)現(xiàn)方式:外部中斷實(shí)現(xiàn)方式和RTC中斷實(shí)現(xiàn)方式。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 下一頁

          評(píng)論


          相關(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); })();