朱振華
(珠海全志科技股份有限公司 廣東省珠海市 519000)
嵌入式系統對功耗很敏感,特別是移動設備,并且隨著嵌入式系統的不斷強大,計算性能的提高,低功耗已經成為嵌入式的重要標準之一。嵌入式系統與PC一樣擁有BIOS系統等對電源管理所需的必要的硬件支持,與此同時,嵌入式硬件還有很大的靈活性,因此需要一個簡單有效的電源管理方案。目前嵌入式Linux系統廣泛的采用了一種名為高級電源管理(Advanced Power Management,APM)技術,高級電源管理(APM)技術基本已經滿足大多數的應用場景。而隨著技術的不斷進步,用戶需求的不斷增加,動態電源管理DPM(Dynamic Power Management)技術提供了一種更為有效的電源管理機制,可以更為行之有效降低嵌入式系統的電源功耗。
嵌入式Linux系統中的所有設備都有一套規范的操作方式,嵌入式電源控制系統中往往包含很多設備,見硬件結構圖1。
結構圖包括CPU,實時時鐘,DRAM,Flash,LCD,UART,audio codec等模塊。其中哪怕有一個設備沒有按照規范設置電源管理的操作,都有可能導致整個系統的電源管理機制失效,通常最終的結果是導致系統的崩潰。
在系統可維持正常所期望工作狀態的情況下,盡可能降低功耗。Linux電源管理涉及到系統待機,頻率電壓變換,系統空閑處理,運行時期電源管理等多個方面。因此電源管理機制中主要采用降低系統運行時鐘及電壓、減少CPU不必要的工作、休眠三種措施來降低功耗。
嵌入式系統主要有兩種工作狀態:
(1)正常工作狀態;
(2)系統休眠態。
電源管理的主要任務是保證系統正常完成任務情況下控制系統在正常工作狀態和系統休眠狀態之間來回切換以降低系統功耗。
系統的休眠狀態技術主要有兩種:
(1)內存休眠(suspend to RAM);
(2)冬眠(suspend to disk).內存休眠技術在喚醒和休眠狀態切換速度快,因此在當今的移動設備中廣泛采用。
系統進入休眠(suspend)狀態過程中內核會完成下面的主要任務:
(1)執行系統中所有的設備驅動程序中的休眠程序。
(2)保存中央處理器中相關寄存器到內存中。
(3)將內核喚醒信息/地址傳遞給引導程序,以便內核在喚醒時候會從該地址開始執行下一步的操作。
(4)處理器進入休眠(suspend)狀態。
系統喚醒(resume)狀態過程中內核會完成下面的主要任務:
(1)喚醒源發出喚醒信號給系統上電。
(2)從休眠階段保存的喚醒地址開始運行。
(3)從內存中恢復中央處理器相關寄存器。
(4)執行每個設備驅動程序中的恢復程序,系統恢復到休眠前狀態繼續運行。
嵌入式系統的外圍設備的電源管理主要有兩個模式:
(1)系統休眠模型;
(2)設備運行模型。
系統休眠中,設備驅動程序就進入了低功耗的狀態或者斷電狀態,作為系統范圍內的功耗管理的一部分。在設備運行電源管理模型中,每一個設備都有根據自己的運行情況自行管理自己的功耗,無需系統處理。

圖1:嵌入式電源控制系統硬件結構圖

圖2:嵌入式系統在功耗分布圖
2.1.1 外圍設備電源管理的實現策略
外部設備的電源管理由獨自的驅動程序來自行管理,電源管理程序會根據當前的設備運行情況,以及計算任務量來選擇適當的時機進入休眠或者喚醒設備。我們可以通過以下方法來設置設備的休眠狀態:
(1)在一定的時間里面,設備的驅動沒有對設備進行相應的訪問,或者設備沒有產生相應的數據信息。按照嵌入式Linux系統的電源管理規范,進行讀寫設備前調用pm.access,原Linux系統中該函數是空函數需要用戶自行定義。我們在該函數中刷新last.access.time值。我們可以通過計算當前值和last.access.time值,可以知道設備有多久沒有被訪問過。
(2)當嵌入式Linux外部設備需要進入休眠狀態時候,會可以調用pm.dev.idle聲明該設備處于空閑狀態中。Linux系統中,pm.dev.idle也是空函數,需要用戶自行實現。我們可以利用該函數接口來修改pm.dev結構的flags。該標志記錄了設備發送的所有請求。
(3)處理器CPU在進入休眠模式之前會通知所有的外圍設備,外圍設備接收到該通知會執行設備睡眠程序,然后進入睡眠模式。
嵌入式系統在功耗方面的分布如圖2所示,處理器在系統中的功耗占據了很大一部分,特別是不帶LCD顯示模塊的系統中。因此如何管理處理器的功耗是嵌入式系統的重點之一。通常情況下,我們可以通過下面的三種途徑:
(1)根據系統負荷大小調整處理器時鐘的頻率,負荷較小時降低處理器的時鐘速度及其電壓。
(2)當當前的處理器處于空閑狀態時候,設置處理器為空閑模式。
(3)系統關閉時候,設置處理器為休眠模式。
2.2.1 嵌入式處理器功耗控制
因為嵌入式處理器的功耗與其性能是正相關的,因此控制嵌入式處理器功耗就是控制處理器的性能大小,同理,處理器的性能與其時鐘頻率又是正相關的,因此我們最終是控制嵌入式處理器的時鐘頻率。大多數處理器都會有相應的寄存器來設置其時鐘頻率。我們可以在該函數中實現對處理器的運行時鐘進行更改,以達到降低處理器功耗的效果。我們可以利用Linux內核當中的cpufreq.set函數,該函數在Kernel/cpufreq.c中實現。
實現的功耗調整需要在適當的時機更改CPU的時鐘速度。我們可以通過調整CPU的運行頻率來改變系統功耗和系統執行任務所需要的時間,比如,如果我們降低CPU的運行頻率,會降低CPU的功耗,但同時會增加CPU執行任務的時間;如果我們提高CPU的運行速率的時候,會增加系統的功耗,同時提高系統性能,減少任務執行時間。這就需要用戶自行決定在功耗和性能之間做個選擇。我們可以通過cpufreq.sysctl函數提供的sysctl接口,在運行代碼中更改,也可以通過系統腳本的方式改變系統文件來更改CPU的主頻。
2.2.2 設置處理器空閑模式
當處理器處于空閑狀態時候,我們可以設置處理器為空閑模式,以降低嵌入式系統功耗。此時嵌入式系統外設仍然是工作的,只是CPU的時鐘會被關閉,直到有中斷將CPU從空閑狀態將CPU喚醒。通過cpu.do.idle函數,修改處理器狀態為空閑狀態。
2.2.3 設置處理器睡眠模式
處理器睡眠模式可以將除了處理器時鐘和電源管理模塊以外,其他設備電源都關閉,此時系統處于一個較低功耗狀態,直到特定事件將系統從睡眠狀態喚醒。
我們可以通過Linux中system.do.suspend和system.do.resume函數來實現使系統進入休眠和喚醒系統的功能。system.do.suspend函數會調用pm.send.all來使所有的外圍設備進入睡眠。system.do.resume函數會將數據從DRAM中導出,并恢復系統到suspend之前的狀態。
上面介紹了嵌入式Linux系統帶有的高級電源管理(Advanced Power Management,APM)技術,高級電源管理(APM)技術基本已經滿足大多數的應用場景。如何有效的管理嵌入式系統電源功耗是一個很有意義的事情,下面我們介紹一種動態電源管理DPM(Dynamic Power Management)技術,包含控制CPU的工作頻率以及電壓,外部總線的時鐘頻率,外部設備時鐘/電源等方面的動態調節以及管理等功能。更為智能的管理嵌入式系統電源功耗。
電路功耗等于動態功耗和靜態功耗相加。

其中P為總功耗,C電容,V電壓,f開關頻率,I漏電流。
從上公式我們可以得到下面三種管理功耗的方法:
(1)調節電壓/時鐘。我們可以通過調節電壓V和時鐘來調節功耗;
(2)時鐘選通f(Clock Gating)。我們可以通過控制時鐘斷開和開通來控制設備在運行和閑置狀態;
(3)電源的連接和斷開(Power Gating)。我們可以控制設備電源的開通來使設備電源處于運行狀態,斷開電源停止設備運行。
上面的理論基礎使我們動態管理嵌入式Linux系統電源成為可能。
嵌入式Linux系統有不同的運行形態,而每種狀態有不一樣的電源等級需求。圖3顯示了Linux有不一樣的運行狀態,并且每種狀態之間的轉換和任務之間的聯系。
我們可以將嵌入式Linux系統動態管理分為三類:
(1)系統掛起/恢復。用于減少產品設備長時間空閑情況下,減少電源功耗。
(2)設備電源管理。用來關斷或者開通設備電源,以達到控制設備功耗的目的。
(3)平臺動態管理。用來管理系統頻繁發生的電源狀態切換。

圖3:操作狀態間的轉換

圖4:嵌入式內核電源動態管理
我們可以將嵌入式內核電源動態管理分為三層:應用層、內核層和硬件設備層。如圖4所示。
應用層:我們可以使用嵌入式Linux系統提供的sysfs文件系統以及設備驅動系統模型來進行電源的動態管理。通過修改任務宏swith_to,實現dpm_set_os(dpm__state)接口來實現當前硬件參數的設置。
內核層:內核層提供了硬件無關的電源管理邏輯控制框架。此層我們主要是實現對底層的硬件細節的屏蔽,以及向應用層提供相應的API接口,和銜接應用層和具體硬件。
硬件設備層:此層主要是為電源動態管理機制提供需要的硬件基礎。主要對應的是各種硬件總線和設備時鐘。
本文介紹了嵌入式電源硬件系統,嵌入式Linux系統的高級電源管理系統,以及通過高級電源管理系統進行嵌入式系統的電源管理,嵌入式Linux系統的高級電源管理系統可以應對大部分的應用場景。但人們總是追求更加完善的方案,因此在本文后面介紹了動態電源管理系統,以更加智能的方式管理嵌入式系統的電源功耗。對于嵌入式系統的電源管理我們還有很多需要完善的地方,比如我們可以根據軟硬件來收集系統的負荷,進一步更加精確的調整系統功耗。電源管理和嵌入式系統實時性能之間的關系需要更進一步的協調處理等。