宋彥,郭兵,沈艷
(1.四川大學計算機學院,成都610064;2.電子科技大學)
宋彥(碩士生),主要研究領域為嵌入式實時系統;郭兵(教授),主要研究領域為嵌入式實時系統、SoC和中間件;沈艷(副教授),主要研究領域為分布式測量系統、嵌入式系統開發、無線傳感器網絡和機器人。
在全球倡導“低碳經濟”的背景下,嵌入式系統的功耗也成為備受關注的熱點問題,尤其是移動終端及手持設備等,對功耗的要求也更加嚴格。嵌入式系統功耗包括硬件所產生的功耗和軟件所產生的功耗,其中軟件所產生的功耗常常被忽略。嵌入式系統是典型的軟件驅動執行系統。硬件的電路活動直接導致系統功耗的產生;軟件的指令執行和數據存取等操作驅動了底層電路活動,間接導致系統功耗的產生。因此,如何降低嵌入式系統軟件所產生的功耗成為研究熱點。
嵌入式硬件電路的低功耗設計是“系統省電的基礎”,而嵌入式軟件的低功耗設計是“系統省電的源頭”。1994年Tiwari等人首先提出對軟件功耗進行研究,并且建立了基本的指令級功耗模型,以486DX為例探討了低功耗編譯技術。按照嵌入式系統硬件低功耗設計的方法和思路,嵌入式軟件低功耗設計是研究在一定性能約束下嵌入式軟件的功耗優化問題,可以歸屬于靜態功耗優化技術。嵌入式軟件功耗的一般計算模型可表示為:

Es表示軟件功耗,Ps表示軟件的平均功率(可通過一組基準程序測試獲得平均值),Ts表示軟件的運行時間,Cs表示軟件/硬件某種功耗相關特征的度量,功耗—特征關聯模型Ps=f(Cs)表示Ps是Cs的函數。如何確定功耗函數f是目前軟件功耗優化研究的一個重要內容。嵌入式軟件功耗函數確定以后,軟件功耗的影響因素、影響程度及因素間的相互關系就很明確。各項研究表明,采用不同的源程序結構會對硬件工作方式造成影響,進而會影響軟件功耗。因此,從軟件功耗計算模型出發,尋找硬件的功耗相關特征,并針對源程序本身進行優化,通過軟件控制硬件的活動,就可以從源頭上降低整個系統的功耗。
隨著嵌入式系統功能和性能不斷增強,嵌入式軟件規模的不斷增長,對嵌入式系統功耗的影響也更加明顯。嵌入式系統被廣泛應用于手持式或便攜式移動產品中,由于這些設備往往依靠電池進行供電,所以要在軟/硬件層次上降低系統能量的消耗,盡可能地延長電池的使用壽命,滿足用戶的應用需求。接下來就從軟件層分析軟件功耗優化技術。
實現同一邏輯功能,采用不同的指令組合方式或者是不同的指令排列順序都會造成不同的軟件能耗。源程序結構級功耗優化,是保持源程序功能不變的前提下,對源程序的語法結構進行重新構造,尋求軟件的最低功耗結構。因此,針對不同的體系結構的微處理器,選擇合適的源程序優化方法。下面就給出兩種比較典型的源程序結構級的優化方法。
①程序結構重排。不同的程序結構可造成不同的軟件功耗,如在固定次數的循環中,當采用增計數循環時,經過編譯后的ARM處理器二進制程序判斷是否進行下一次循環的步驟是:首先經過一次加法(ADD)操作,然后經過比較(CMP)操作,最后根據比較結果判別是否進入循環(BCC)操作。一次循環該過程需要 3條二進制指令。當采用減計數循環時,判斷是否進入循環的步驟是:首先經過一次減法(SUBS)操作,然后根據減法設置的寄存器位(以ARM處理器為例,該位是 R15中的條件碼標志位Z)判斷是否進入循環(BNE)操作。一次循環該過程需要兩條2進制指令。因此,通過循環結構中減計數循環代替增計數循環的方法,循環的多次執行能夠減少軟件運行時執行的二進制總指令數量,從而有效降低嵌入式軟件能耗。
②優化數據類型。以32位體系結構來說,不同類型的數據表示在內存中的呈現形式將導致不同的后續處理步驟,從而造成軟件功耗的差異。對于非32位數據,CPU會消耗更多的時鐘周期來處理邊界不對齊、變量存儲范圍檢查等情況。因此,對于存放在寄存器中的局部變量,除了8位或者16位運算外,盡量不要使用char和 short類型數據,而應該使用由符號或者無符號32位int類型數據。對于除法運算,一般使用無符號32位int類型數據,速度更快,能耗更低。
在嵌入式系統中,串口通信是比較常見的一種通信方式。通常,串口數據傳輸有查詢方式和中斷方式兩種,UART收發數據是通過從存儲器或I/O端口位置進行讀寫來實現的。大多數的情況串口是空閑的,而且無法得知下一個串口數據何時到達。為了節約能量,可以讓CPU處于休眠狀態。在該狀態下的系統時鐘仍然工作,并且UART處于可接受狀態,但這不是最優的設計方案。最佳方案是讓CPU處理掉電模式,此時系統時鐘停止工作,芯片功耗降到了最低。下面以串口收發數據為例說明中斷的實現過程。
①接收數據。當采用中斷模式時,從接收移位寄存器接收到一個完整的字節,并將數據送入數據輸入寄存器時產生一個中斷,中斷處理程序從端口讀入字節,清除中斷源。當串口任務從ISR或接口函數以獨占的方式訪問緩沖區時,中斷就會停止。如果應用程序不及時取出緩沖區中的字節,緩沖區滿后就會導致接收數據丟失。
②發送數據。字節存儲與輸出緩沖區,當UART的發送端準備發送字節時,將會產生一個中斷,串口任務將字節從緩沖區中取出,通過中斷服務子程序產生一個信號量,喚醒串口發送任務。
需要指出的是,對于實時性要求嚴格的系統,采用中斷的方式會增加系統的響應時間,這樣就會造成系統實時性的降低。因此,中斷適用于實時性要求不高而對功耗要求嚴格的系統。
微處理器以及各種接口控制器都有不同的功耗模式,在系統設計的過程中如果能充分利用這些功耗模式,就可以顯著地降低系統的功耗。正常模式下處理器將打開所有的功能模塊全速運行,因此處理器可以選擇關閉部分或全部的功能模塊,使系統進入低功耗模式。
S3C2410A是一個典型、應用廣泛的32位ARM 微處理器。S3C2410A的時鐘控制邏輯能夠產生系統需要的時鐘,S3C2410A有兩個 PLL(Phase Locked Loop),一個用于FCLK、HCLK、PCLK,另一個用于 USB模塊(48 MHz)。時鐘控制邏輯能夠由軟件控制,不將PLL連接到各接口模塊,以降低處理器時鐘頻率,從而降低功耗。S3C2410A針對不同任務提供最佳功率管理策略,功率管理模塊是系統工作在如下4種模式。
正常模式:功率管理模塊向CPU和所有外設提供時鐘,此時所有外設都是開啟的,系統功耗達到最大。用戶可以通過軟件控制不需要的開關以降低功耗。
低速模式:直接使用外部時鐘作為FCLK,該模式下的功耗僅由外部時鐘決定。
空閑模式:時鐘FCLK不連接到CPU內核,而是連接到所有的其他外圍接口。空閑模式降低了CPU內核部分的功耗。任何對CPU的中斷請求都可以將從空閑模式喚醒。
掉電模式:功率管理模塊斷開內部電源,CPU和除喚醒單元意外的外設都不會產生功耗。掉電模式需要兩個獨立電源,一個是給喚醒邏輯單元供電,另一個給包括CPU在內的其他模式供電。在掉電模式下,第二個電源將被關掉。掉電模式可以由外部中斷EINT[15:0]或RTC喚醒。
在S3C2410A處理器中,為了減少功耗,一般采用軟件控制系統時鐘,上述4種模式之間不允許隨意轉換,后面的優化部分利用S3C2410A的電源管理模式,使系統工作在低功耗模式。可用的轉換模式如圖1所示。

圖1 S3C2410A電源管理轉換模式
通常情況下,嵌入式系統各個模塊不是同時進行工作的,充分利用各個器件低功耗模式,可以降低整個系統的平均功耗。以手機為例,大多數情況下手機是處于待機狀態,工作模式分為通話、收發短信、音/視頻播放和游戲等。手機在待機狀態下系統大部分都可以進入停機模式,即使在使用狀態時也可以根據功能要求讓閑置控制器保持在低功耗模式。
該終端系統的硬件平臺采用Samsung公司的S3C2410A微處理器和SIMCOM公司的GSM模塊SⅠM100-E,嵌入式操作系統選擇μ C/OS-II實時操作系統。本文主要是對GSM應用相關的功能設計與實現,搭建該軟件平臺是用來進行嵌入式軟件功耗優化,驗證功耗的降低程度。該系統設計目標主要完成短消息收發和語音通話功能。系統軟件體系結構如圖2所示。

圖2 GSM終端軟件體系結構
μ C/OS-II提供了多任務的機制,在軟件設計時,開發者只需要對每個任務的功能實現進行程序設計,而不必專注程序細節的具體運行。該終端系統的任務劃分及資源分配如表1所列。

表1 任務劃分及資源分配表
該終端系統按照應用功能,劃分為8個任務:起始任務、短消息接收任務、短消息發送任務、呼出任務、呼入任務、鍵盤掃描任務、串口任務和顯示任務。起始任務用來建立一系列的信號量;短消息接收任務用來完成短消息的查看、刪除、回復處理;短消息發送任務用來完成短消息的編輯、發送處理;呼出任務用來完成輸入、呼出處理;呼入任務主要負責接聽、拒接處理、呼叫轉移處理(本系統未實現該功能);鍵盤任務用來掃描鍵值,判斷用戶的輸入;顯示任務負責界面的初始化,以及顯示正在運行的是哪一個任務。μ C/OS-II對任務的調度是按照優先級的大小進行的,因此,完成系統任務的劃分之后,需要對任務的優先級進行劃分。
主函數中,首先是目標系統硬件初始化階段,包括最小硬件初始化ARM Target_Init()、無線模塊GSM_Init()及 LCD_Init();然后調用OSInit()對 μ C/OS-II初始化,接下來在主函數中建立系統優先級最高的任務StartTask(),最后調用OSStart()啟動多任務操作系統,交給內核進行任務管理。主程序代碼如下:

需要說明的是,主函數盡管定義為一個返回整數值的函數,但是語句“return 0;”是不可能執行的,使用μ C/OS-II必須在啟動函數OSStart()之后再初始化系統時鐘,目的是防止在任務啟動之前就進行時鐘中斷。
一個嵌入式系統,中斷是必須使用的,尤其是對時間要求及其嚴格的產品中,幾乎所有的工作都要依靠中斷完成。在μ C/OS-II實時操作系統中,如果過于頻繁地利用中斷就會削弱μ C/OS-II的性能,但是中斷是必須使用的。中斷服務函數在每次中斷產生的時候就會被調用,因此中斷服務函數的執行時間應該盡可能地短,只需要發送相應的信號量給等待資源的任務,復雜的處理任務交給任務去執行。在ADS編譯器中,IRQ服務程序必須用__irq關鍵字聲明,這樣編譯器才能夠自動生成處理器模式切換代碼和保護現場、恢復代碼。
本文使用的ZLG7290芯片的從地址slave address為70H(01110000B),有效的按鍵動作、普通鍵的單擊連擊和功能鍵狀態變化都會令系統寄存器SystemReg的KeyAvi位置1。/INT引腳信號正常為高電平,當按鍵被按下時變為低電平有效。EINT4中斷服務程序需要完成鍵盤信號量的發送,以喚醒鍵盤任務,然后調用OSIntExit()退出中斷服務程序。
由于篇幅的限制,對于該GSM終端系統的任務設計部分不在此敘述。GSM終端實現了基本的短消息發送和語音通話功能,為下一節的軟件功耗優化提供了較好的實例平臺。
在前面兩節內容的基礎之上,將軟件功耗優化技術應用于GSM終端,以驗證軟件優化對整個系統帶來的實際節能效果。針對GSM終端系統,主要采用下面兩種優化方法。
本文的主要目的是降低系統空閑狀態下的能量消耗,使系統盡可能工作在低功耗狀態,因此,這里主要是通過設置CPU工作模式,選擇CPU的掉電模式為該系統的低功耗模式,當系統空閑時,即無應用任務執行,使系統進入低功耗模式,以降低系統的功耗。
μ C/OS-II為用戶提供了空閑任務接口函數OSTask-Idle-Hook(),當系統在沒有應用任務執行時,就運行空閑任務OSTaskIdle(),運行時給空閑計數器OSIdleCtr加1,該任務是由系統建立并且優先級最低,此時可以調用OSTaskIdleHook(),OSTaskIdleHook()調用CPU的特定指令(假設CPU的低功耗指令是STOP),這樣就可以使CPU進入低功耗模式(按照2.3小節電源轉換關系),等待中斷的發生。當中斷發生時,CPU就會退出低功耗模式,執行中斷服務子程序,中斷服務子程序就會向更高級的任務發送信號量,使得高優先級的任務開始執行。當所有任務再次等待事件發生時,μ C/OS-II在中斷服務子程序完成之后,又會切換至空閑任務,這樣OSTaskIdleHook()就會再次被OSTaskIdle()調用,使CPU進入低功耗模式。
當串口采用中斷方式進行數據的接收和發送時,進入中斷后,先屏蔽發送和接收中斷,以UART0為例,通過下面一條語句:

當正常發送和接收結束后,清中斷掛起和中斷源掛起寄存器:

需要編寫串口發送和接收中斷服務程序,本文編寫的中斷服務函數原型為:

針對串口部分進行優化,主要原因是GSM終端系統工作是通過控制串口發送AT命令,要對串口頻繁進行操作,優化后就可以減少CPU大量的查詢時間,這樣就減少了CPU的功耗。
本文采用HIOKI3334功率分析儀測試處理器的功耗,功率分析儀的正負極分別接入CPU供給電源的兩端,然后進行測試。首先測試GSM終端系統在空閑狀態下的初始功耗值,然后測試優化后的系統在同樣工作狀態下的功耗值。兩種情況下功耗測量硬件條件相同,不同的是軟件的執行方式,使得實驗結果在軟件層面上具有可比性。優化前,系統空閑狀態下CPU的功耗為0.116 W;優化后,系統空閑時就會進入低功耗模式,此時CPU的功耗為0.057 W。實驗結果表明,低功耗模式比空閑模式功耗下降大約50.86%。因此,對于依靠電池進行供電的移動設備來說,要充分利用器件的工作模式,通過軟件優化降低系統空閑期間的功耗,延長電池使用時間。
[1]V Tiwari,S Malik,A Wolfe.Power analysis of embedded software:a first step towards software power minimization[J].IEEE Transactions on VLSI Systems,1994,2(4):437-445.
[2]Samsung Electronics.S3C2410X 32-Bit RISC Microprocessor User's Manual,2003.
[3]C Hwang,H Wu.A predictive system shutdown method for energy saving of event-driven computation[C].International Conference on Computer-Aided Design,1997.
[4]羅剛,郭兵,沈艷,等.源程序級和算法級嵌入式軟件功耗特性的分析與優化方法研究[J].計算機學報,2009,32(9):1869-1875.
[5]郭兵,沈艷,邵子立,綠色計算的重定義與若干探討[J].計算機學報,2009,32(12):2311-2319.
[6]周寬久,遲宗正.嵌入式軟硬件低功耗優化研究綜述[J].計算機應用研究,2010,27(2):423-425.
[7]Jean J Labrosse.嵌入式實時操作系統 μ C/OS-II[M].邵貝貝,等譯.北京:北京航空航天大學出版社,2003.