宋麗華,戰 穎,簡 陽,張鑫磊,鮑世昆
(北方工業大學信息工程學院,北京100144)
隨著便攜式嵌入式設備功能需求的增長,系統的電池儲能能力增長速度越來越不能與之相匹配,因此對系統有限電能進行管理已成為嵌入式系統的一個重要研究方向[1]。電源管理的一個關鍵部分就是對系統的功耗模式進行切換,系統的休眠與喚醒則是其中的一種低功耗工作切換方式。Win-dows Embedded CE 6.0可以為多種類型的嵌入式設備構建實時操作系統,具有Windows平臺兼容性、可定制性和高穩定的特點,集成部分電源管理接口[2];S3C6410是基于ARM架構的嵌入式處理器,具有低功耗、高性能的特點,支持多種功耗模式,集成內核電源管理模塊[3]。基于S3C6410處理器和Windows Embedded CE 6.0操作系統的特點,實現系統休眠與喚醒,以達到通過切換功耗模式來實現電源管理的目的。系統休眠與喚醒作為電源管理的核心模塊,直接調度整個嵌入式系統的電源能耗,對整個系統的電源管理起著至關重要的作用[4]。
在微軟的Windows Embedded CE 6.0操作系統中,通過以下四種方式可以使得操作系統進入休眠狀態:
(1)用戶在操作系統桌面的開始菜單選擇掛起選項;
(2)用戶短按電源開關鍵,請求系統進入休眠;
(3)用戶長時間無操作,根據嵌入式操作系統中電源管理策略將系統狀態由POWER_STATE_ON轉為POWER_STATE_USERIDLE、POWER_STATE_IDLE狀態,最后進入POWER_STATE_SUSPEND,即休眠狀態;
(4)用戶可以在設備驅動或者應用程序中調用Windows Embedded CE 6.0操作系統提供的標準電源管理函數接口SetSystemPowerState來對系統電源狀態進行設置[4]。
S3C6410芯片中的電源管理模塊支持五種功耗模式:NORMAL模式、IDLE模式、STOP模式、DEEP-STOP模式和SLEEP模式。最低功耗模式的體現是:在SLEEP模式下,除了系統的喚醒源模塊和實時時鐘RTC以外,電源管理模塊將CPU和其他具有電源控制能力的內部邏輯模塊的電源關閉。S3C6410在此模式中,絕大多數內部電源都已經斷電,不僅是RTC和電源管理器的內部單元ALIVE模塊,其他內部所有的時鐘源和外部低電壓電源的供電也處于無效狀態。本文采用的開發板處理器電源模塊部分處于可控狀態。由于ADC/DAC模塊和ALIVE模塊需要一直處于供電狀態,因此它們是不可控的,電源可控部分包括USB OTG、Mobile DDR、PLL和系統I/O模塊,它們在休眠與喚醒的過程中是可以控制的。圖1為部分可控電源域的硬件連接方式。
三星S3C6410芯片內部可預先設定IO接口的狀態,系統恢復要通過預設的外部事件或者指定的內部喚醒事件。系統進入休眠模式時,S3C6410按照預設的順序關閉內部的可控電源,同時關閉外部可控邏輯的電源域,使得系統的大部分供電關閉,即將系統CPU的XPWRRGTON引腳置位,使得外部電源關閉,同時S3C6410芯片的VDD_PLL、VDD_OTG、VDD_IO等掉電。系統的休眠與喚醒模式如圖2所示,CPU內部的電源控制邏輯一直處于供電狀態,它通過XPWRRGTON控制外部的電源管理電路,同時外圍的電源管理電路反饋控制CPU的內核系統供電,系統的休眠喚醒事件都是通過內部的電源控制邏輯對整個系統進行休眠或者喚醒。

Figure 1 Controllable power domain connecter圖1 可控電源域的硬件連接方式

Figure 2 Sleep mode and wakeup mode on S3C6410圖2 S3C6410系統休眠與喚醒模式
為使得系統執行任務時處于最優的功耗狀態,S3C6410芯片在電源控制邏輯模塊具備多種電源管理方案,總體上主要包括電壓/時鐘調節、時鐘選通、電源供應選通三種方案。電壓/時鐘調節是指通過降低電壓和時鐘來減少活動功耗和靜態功耗。S3C6410芯片電源管理由四個模塊組成,它們分別是通用時鐘門控模式、閑置模式、停止模式和睡眠模式。而所謂時鐘選通就是利用這四個模塊中的通用時鐘門控、閑置或停止模式停止電路時鐘,即讓時鐘從不用的電路模塊斷開進而減少活動功耗;電源供應選通則是利用睡眠模式,斷開電路中不使用的模塊電源供應。本文所使用的是上述第三種方案——電源供應選通,因此需要用到S3C6410提供的兩路獨立電源,一路電源給CPU及其內部邏輯供電,另一路電源單獨給喚醒邏輯供電[5]。當S3C6410進入休眠時,CPU及其內部邏輯的這一路供電將會停止,僅保留喚醒邏輯的供電和RTC,系統各個電源域的情況如圖3所示。

Figure 3 Power domains at sleep mode圖3 Sleep模式下的電源域
S3C6410在休眠模式下,通過使用外部電源調節器,使得除了ALIVE模塊和RTC模塊之外的其他所有硬件邏輯都斷電。休眠模式支持待機時間最長,但是用戶軟件必須將所有的內部狀態保存到外部存儲設備上或者內存的休眠信息存儲區上。ALIVE模塊等待外部喚醒事件,同時RTC存儲時間信息。用戶軟件可配置內部喚醒源,也可以通過GPIO配置各個I/O引腳的狀態和工作模式作為外部喚醒方式。
S3C6410的喚醒邏輯支持EINT0-15、RTC警告、TICK、鍵盤中斷、MSM、電池故障、HSI和溫復位中斷,如果休眠期間產生這些中斷,系統將恢復對CPU的供電并喚醒CPU。
本文結合Windows Embedded CE 6.0操作系統的電源管理機制和S3C6410芯片的特性,實現整個系統的休眠和喚醒過程。由于休眠與系統關機在功能上很相似:休眠只比系統關機多了保存現場(各類寄存器)和設置觸發事件的步驟,因此掌握系統關機的技術后再實現休眠功能就會相對容易。而喚醒功能包括恢復休眠現場和喚醒源的觸發處理,是休眠的逆過程。這一過程如圖4所示。

Figure 4 Process of sleep mode and wakeup mode圖4 系統休眠與喚醒的過程
下面詳細介紹系統休眠與喚醒的實現過程。
Windows Embedded CE 6.0操作系統在休眠之前,首先要根據電源管理的策略對那些支持電源管理的設備進行電源關閉,一般各個設備驅動中的Power Down接口函數將被系統調用實現設備電源的關閉;然后操作系統的底層函數OEMPower Off被調用,使得整個系統進入休眠狀態。其中OEMPower Off函數位于三星開發包S3c6410_sec_v1\Oal\Power\off.c文件中,本系統在此文件中實現底層的系統休眠和喚醒。
進入休眠的過程是通過Windows Embedded CE 6.0嵌入式系統應用層面提供的四種方法層層調用,最終調用OEM層的OEMPower Off函數實現的。此函數依次調用BSPPower Off來禁止動態電壓管理,并將其設為全速模式,同時禁用RTC控制器,進行GPIO配置和喚醒源的配置;再將特殊功能寄存器物理地址映射到虛擬地址;調用S3C6410_SaveState_VIC函數保存VIC向量中斷控制寄存器;禁用所有的中斷;調用S3C6410_SaveState_DMACon函數保存DMA控制寄存器;調用S3C6410_SaveState_GPIO函數保存GPIO的狀態;調用S3C6410_SaveState_SysCon保存系統控制寄存器的狀態;調用OALCPUPoweroff函數,使得CPU進入休眠模式。調用OALCPUPoweroff函數完成當前系統狀態信息的保存,將包括SVC寄存器、CP15寄存器等在內的一些關鍵寄存器里的數據保存到SDRAM的休眠數據區,最后將處理器功耗模式切換到休眠模式。當內核處理器被喚醒以后,板級系統使用SDRAM中的數據恢復整個操作系統。系統休眠的過程可概括地表示為如圖5所示的流程。

Figure 5 Process of sleep mode圖5 系統休眠過程
由于S3C6410處理器內核在休眠期間是掉電的,當它被喚醒后將會從地址0x00000000重新開始執行指令。也就是說,這時候CPU已經脫離了Windows Embedded CE 6.0的執行空間,運行的是Boot Loader,即Boot Loader中的OALCPUPoweroff函數,其具體實現在Startup.s文件中。
S3C6410內部系統進入休眠模式的順序是:
(1)PWR_CFG[6:5]被用戶軟件置位為系統休眠模式;
(2)用戶軟件通過MCR指令(MCR P15,0,Rd,C7,C0,4)產生STANDBYWFI信號;
(3)SYSCON系統控制器要求總線控制器完成當前AHB總線處理任務;
(4)當前AHB總線處理任務完成后,AHB總線控制器向SYSCON發送已經完成的確認信息;
(5)SYSCON要求域V完成當前AXI總線任務;
(6)當前AXI總線任務完成后,AXI控制器向SYSCON發送已經完成的確認信息;
(7)外部存儲器如SDRAM必須在休眠模式下保存好當前系統信息,即保護系統現場,然后SYSCON要求外部存儲控制器進入自刷新模式,如若不能保存當前信息,系統喚醒時將不能恢復現場;
(8)外部存儲控制器(即內存SDRAM)進入自刷新模式以后將向SYSCON發送確認信息;
(9)如果PLL被使用,SYSCON將以外部振蕩器替代內部的PLL作為時鐘源輸出;
(10)SYSCON禁用PLL的操作和晶體振蕩器;
(11)SYSCON為實現內部邏輯而配置XPWRRGTON管腳為低電平狀態,以此斷開外部電源作為內部源,XPWRRGTON管腳控制外部調節器,以達到控制外部電源的目的。
喚醒過程是休眠過程的逆過程,喚醒流程圖如圖6所示。同樣,在OALCPUPoweroff函數喚醒中System_Wait ForInterrupt函數檢測到喚醒源的中斷,則恢復對SDRAM的供電,然后從SDRAM的休眠數據區中將先前的CPU寄存器數據導入,返回Windows Embedded CE 6.0的執行空間;回到Windows CE 6.0的執行空間,調用S3C6410_RestoreState_SysCon恢復系統控制寄存器的數據;然后調用S3C6410_RestoreState_GPIO函數恢復GPIO的狀態;再調用S3C6410_RestoreState_DMACon函數恢復DMA控制寄存器的狀態;調用S3C6410_RestoreState_VIC函數恢復VIC狀態;然后初始化串口調試;再調用OEMInitializeSystem Timer函數初始化系統時鐘;調用InitializeOTGCLK函數開啟USB;調用BSPPower On函數判斷喚醒源等。

Figure 6 Process of wakeup mode圖6 系統的喚醒過程
以上是一個嵌入式系統整體的喚醒過程。S3C6410處理器內部系統控制器控制部分的喚醒過程如下:
(1)SYSCON將XPWRRGTON管腳置于高電平狀態,以此使能外部電源,同時通過設置寄存器PWR_STABLE等待時鐘穩定;
(2)SYSCON生成系統時鐘HCLK、PCLK、ARMCLK;
(3)SYSCON發出系統復位信號HRESETn和PRESETn;
(4)SYSCON發出ARM的復位信號。
在實際產品應用中,用戶可根據不同的需求采用不同的喚醒源。例如,以休眠模式待機,在需要周期性地喚醒休眠系統的情況下,用戶就需要設置RTC時鐘作為喚醒源,如果僅僅在想喚醒設備的時候再喚醒,則可以設置一個觸摸屏觸發的外部中斷來實現。S3C6410就提供了多種喚醒實現方式,如EINT0-15、TICK、鍵盤中斷、MSM、電池故障、HSI、溫復位。三星S3C6410芯片所支持的不同功耗模式下的喚醒源如圖7所示。

Figure 7 Wakeup sources in different power modes圖7 S3C6410不同功耗模式下的喚醒源
典型的喚醒源實現方式有兩種:基于普通外部中斷的實現方式和基于鍵盤事件的實現方式。
3.2.1 基于外部中斷的系統喚醒實現方式
根據系統休眠喚醒的原理,S3C6410芯片在休眠之前必須在OALCPUPoweroff函數中正確設置外部中斷作為喚醒源,芯片系統才能被正常喚醒。正確設置作為喚醒源的中斷有以下三個重要步驟:
(1)把作為外部喚醒源的GPIO接口設置為復用的中斷功能,本文把GPN[11]設為中斷口。
(2)實際操作能滿足外部中斷觸發條件,如果將某種喚醒使用的中斷源所對應的接口與一個電平變化的器件相連,比如按鍵,需要通過判斷此接口上電平的變化來觸發這個中斷。在powerbutton.c文件中將電源GPN[11]設為EINT11,代碼如下:

3.2.2 基于鍵盤事件中斷的系統喚醒實現方式
基于鍵盤中斷的方式實現休眠喚醒是通過調用鍵盤驅動來實現的。操作系統必須具備鍵盤驅動機制,Windows Embedded CE 6.0是可定制鍵盤接口的。當鍵盤有按鍵按下時,鍵盤驅動檢測并觸發鍵盤消息中斷,當內核電源管理模塊檢測到鍵盤中斷,再將整個系統喚醒起來。對于鍵盤這樣的喚醒源的設置如下:

本文通過實驗多種喚醒源中的兩種典型喚醒方式,驗證系統休眠與喚醒是否成功。當Windows Embedded CE 6.0操作系統在基于S3C6410的視障者閱讀輔助器完全啟動后,按下開始菜單中的“掛起”鍵,屏幕將關閉,系統大多數設備停止工作,此時開始測試。測試方法如下:
(1)通過按下電源開關鍵,整個系統被喚醒啟動起來,重新進入Windows Embedded CE 6.0系統桌面;
(2)用微軟的ActiveSync同步連接工具以USB的方式連接已經啟動的Windows Embedded CE 6.0系統,檢測當系統掛起時,檢測同步連接功能是否有效,同時用萬用表測試核心板上S3C6410芯片的VCC_OTG電壓是否正常。
測試結果:即按即啟,沒有延遲,同時同步工具ActiveSync在休眠時斷開,VCC_OTG的電壓為0 V,當系統喚醒以后VCC_OTG電壓為3.3 V,恢復正常,同步工具也能正常連接。通過鍵盤事件或者外部中斷可以正常喚醒休眠中的系統,效果理想。
嵌入式系統的系統級電源管理的基本思路是調整芯片的工作電壓和工作頻率,而S3C6410芯片的內核處理器支持動態電壓和頻率的調節。根據CMOS電路功耗的理論公式[6,7]:

其中,P表示功耗;C表示系統的電容,是一個常量;V表示工作電壓;F表示工作頻率。工作電壓和工作頻率又成正比例關系,頻率的提高需要以電壓的提高作為基礎。

其中,E表示能耗,t表示時間。對于一個指定的處理任務,F*t是常量,因此根據公式可知,在降低處理器工作頻率的同時降低處理器的工作電壓,這樣才能達到降低功耗的目的。
本文所研究的系統休眠與喚醒過程對處理器的工作頻率和動態電壓的調節符合以上理論原理。典型的處理器電壓調節在于喚醒時S3C6410內部控制器SYSCON生成系統時鐘HCLK、PCLK、ARMCLK時對系統時鐘的靜態配置,同時采用LTC3714電源開關穩壓控制器配合系統進行動態電壓的調節,以此達到有效控制系統級功耗的目的。
休眠喚醒作為基本的電源管理方式之一,對系統電壓的極端控制達到的效果如表1所示。

Table 1 Change of power modes in sleep mode and wakeup mode表1 系統休眠喚醒過程中部分電源域變化情況 V
據表1可知,由于本文所采用的開發板的部分設備電源,如ADC,未進行電源控制,則整個過程中電壓不可控,無任何改變,而OTG等設備電源域可控,這形成了一個對比的效果。這里ALIVE是不在這個范疇的,它在設計之時就必須處于長期供電的狀態,是CPU的關鍵電源域,關系到整個設備的休眠與喚醒。
作為電源管理方式之一的LCD屏幕背光控制,用萬用表測量所得到的效果如表2所示。

Table 2 Comparison of the backlight brightness and voltage表2 屏幕背光亮度及電壓對比
根據屏幕背光原理,控制的機制是通過PWM脈寬調制電壓值,以此達到對屏幕背景光電壓輸出的控制,從而形成亮度調節。開關電壓輸出的值一定,而脈寬調制信號的頻率和占空比則決定了實際有效輸出電壓值。實際值的有效控制真正達到了系統能耗的有效管理。
ARM體系結構的便攜式電子產品功耗分布如圖8所示[8],本課題采用的S3C6410系統即為ARM體系結構。其中處理器功耗和屏幕功耗占整個系統的絕大部分。

Figure 8 Power distribution of the ARM architecture portable electronics圖8 ARM體系結構便攜式電子產品功耗分布
根據ARM體系結構電子產品功耗可知,CPU耗電約為整個系統的30%。根據表1中CPU休眠時電源域的電壓變化情況可知,其中40%的功耗接入休眠喚醒控制以后處于可控狀態。同理,由圖8可知,屏幕功耗達到42%,且由表2可知不同的背光程度功耗節省度不同。最終的功耗節省情況如表3所示。

Table 3 Effect after using the power management program表3 系統引入電源管理前后效果對照表
由表3可知,如果系統在控制策略中加入系統的休眠喚醒步驟將降低系統功耗,極端的情形下系統功耗最低,這將在單位時間內為CPU節省12%的功耗;同時,由于休眠與喚醒屬于系統電源管理范疇,將對設備電源等產生一系列的映射控制關系,這使得應用休眠與喚醒策略將顯著地降低整個嵌入式系統的功耗。
本文根據S3C6410處理器模塊的特性和Windows Embedded CE 6.0電源管理驅動結構,研究并實現了嵌入式系統休眠與喚醒,并對喚醒源設置等問題進行了研究。實驗結果表明,應用本文設計的休眠與喚醒策略顯著地降低了系統功耗,并且項目成果已成功應用于實際項目之中,實際使用測試表明該策略有效提升了系統續航能力。
[1] Xing Xiang-lei,Zhou Yu,Du Si-dan.Power management software based on embedded Linux system[J].Computer Engineering,2010,36(1):253-255.(in Chinese)
[2] Wang Bing.Embedded advanced programming and detailed examples of Windows CE[M].Beijing:China Water Power Press,2008.(in Chinese)
[3] S3C6410X user manual[M].Samsung Electronics,2008.
[4] Jian Yang.The research and implement of the technology of power management on embedded system[D].Beijing:North China University of Technology,2012.(in Chinese)
[5] Chu Shuai,Du Jiang,Cai Chang,et al.Design of portable terminal power management system based on ARM[J].E-lectronic and Electro-optical Systems,2011,36(1):56-59.(in Chinese)
[6] Pouwelse J,Langendoen K,Sips H.Dynamic voltage scaling on a low-power microprocessor[J].ACM SIGMOBILE,2001,7:251-259.
[7] Li Lin-gong.Low power consumption design for embedded system[J].Application Research of Computers,2004,31(2):177-180.(in Chinese)
[8] Power management in portable ARM based systems accelent systems[M].Cliff Brake,2002.
[9] Xiao Kun.The unified driver framework research and implementation of embedded systems on cross-platform[D].Chengdu:University of Electronic Science and Technology of China,2008.(in Chinese)
附中文參考資料:
[1] 邢向磊,周余,都思丹.基于嵌入式Linux系統的電源管理軟件[J].計算機工程,2010,36(1):253-255.
[2] 汪兵.Windows CE嵌入式高級編程及其實例詳解[M].北京:中國水利水電出版社,2008.
[4] 簡陽.嵌入式系統電源管理關鍵技術研究與實現[D].北京:北方工業大學,2012.
[5] 褚帥,杜江,蔡昌,等.基于ARM便攜式終端電源管理系統設計[J].電光系統,2011,36(1):56-59.
[7] 李林功.嵌入式系統的低功耗設計[J].計算機應用研究,2004,31(2):177-180.
[9] 肖堃.嵌入式系統跨平臺統一驅動框架技術研究與實現[D].成都:電子科技大學,2008.