朱振華
(珠海全志科技股份有限公司 廣東省珠海市 519000)
嵌入式系統(tǒng)對功耗很敏感,特別是移動設(shè)備,并且隨著嵌入式系統(tǒng)的不斷強(qiáng)大,計算性能的提高,低功耗已經(jīng)成為嵌入式的重要標(biāo)準(zhǔn)之一。嵌入式系統(tǒng)與PC一樣擁有BIOS系統(tǒng)等對電源管理所需的必要的硬件支持,與此同時,嵌入式硬件還有很大的靈活性,因此需要一個簡單有效的電源管理方案。目前嵌入式Linux系統(tǒng)廣泛的采用了一種名為高級電源管理(Advanced Power Management,APM)技術(shù),高級電源管理(APM)技術(shù)基本已經(jīng)滿足大多數(shù)的應(yīng)用場景。而隨著技術(shù)的不斷進(jìn)步,用戶需求的不斷增加,動態(tài)電源管理DPM(Dynamic Power Management)技術(shù)提供了一種更為有效的電源管理機(jī)制,可以更為行之有效降低嵌入式系統(tǒng)的電源功耗。
嵌入式Linux系統(tǒng)中的所有設(shè)備都有一套規(guī)范的操作方式,嵌入式電源控制系統(tǒng)中往往包含很多設(shè)備,見硬件結(jié)構(gòu)圖1。
結(jié)構(gòu)圖包括CPU,實時時鐘,DRAM,F(xiàn)lash,LCD,UART,audio codec等模塊。其中哪怕有一個設(shè)備沒有按照規(guī)范設(shè)置電源管理的操作,都有可能導(dǎo)致整個系統(tǒng)的電源管理機(jī)制失效,通常最終的結(jié)果是導(dǎo)致系統(tǒng)的崩潰。
在系統(tǒng)可維持正常所期望工作狀態(tài)的情況下,盡可能降低功耗。Linux電源管理涉及到系統(tǒng)待機(jī),頻率電壓變換,系統(tǒng)空閑處理,運(yùn)行時期電源管理等多個方面。因此電源管理機(jī)制中主要采用降低系統(tǒng)運(yùn)行時鐘及電壓、減少CPU不必要的工作、休眠三種措施來降低功耗。
嵌入式系統(tǒng)主要有兩種工作狀態(tài):
(1)正常工作狀態(tài);
(2)系統(tǒng)休眠態(tài)。
電源管理的主要任務(wù)是保證系統(tǒng)正常完成任務(wù)情況下控制系統(tǒng)在正常工作狀態(tài)和系統(tǒng)休眠狀態(tài)之間來回切換以降低系統(tǒng)功耗。
系統(tǒng)的休眠狀態(tài)技術(shù)主要有兩種:
(1)內(nèi)存休眠(suspend to RAM);
(2)冬眠(suspend to disk).內(nèi)存休眠技術(shù)在喚醒和休眠狀態(tài)切換速度快,因此在當(dāng)今的移動設(shè)備中廣泛采用。
系統(tǒng)進(jìn)入休眠(suspend)狀態(tài)過程中內(nèi)核會完成下面的主要任務(wù):
(1)執(zhí)行系統(tǒng)中所有的設(shè)備驅(qū)動程序中的休眠程序。
(2)保存中央處理器中相關(guān)寄存器到內(nèi)存中。
(3)將內(nèi)核喚醒信息/地址傳遞給引導(dǎo)程序,以便內(nèi)核在喚醒時候會從該地址開始執(zhí)行下一步的操作。
(4)處理器進(jìn)入休眠(suspend)狀態(tài)。
系統(tǒng)喚醒(resume)狀態(tài)過程中內(nèi)核會完成下面的主要任務(wù):
(1)喚醒源發(fā)出喚醒信號給系統(tǒng)上電。
(2)從休眠階段保存的喚醒地址開始運(yùn)行。
(3)從內(nèi)存中恢復(fù)中央處理器相關(guān)寄存器。
(4)執(zhí)行每個設(shè)備驅(qū)動程序中的恢復(fù)程序,系統(tǒng)恢復(fù)到休眠前狀態(tài)繼續(xù)運(yùn)行。
嵌入式系統(tǒng)的外圍設(shè)備的電源管理主要有兩個模式:
(1)系統(tǒng)休眠模型;
(2)設(shè)備運(yùn)行模型。
系統(tǒng)休眠中,設(shè)備驅(qū)動程序就進(jìn)入了低功耗的狀態(tài)或者斷電狀態(tài),作為系統(tǒng)范圍內(nèi)的功耗管理的一部分。在設(shè)備運(yùn)行電源管理模型中,每一個設(shè)備都有根據(jù)自己的運(yùn)行情況自行管理自己的功耗,無需系統(tǒng)處理。
圖1:嵌入式電源控制系統(tǒng)硬件結(jié)構(gòu)圖
圖2:嵌入式系統(tǒng)在功耗分布圖
2.1.1 外圍設(shè)備電源管理的實現(xiàn)策略
外部設(shè)備的電源管理由獨自的驅(qū)動程序來自行管理,電源管理程序會根據(jù)當(dāng)前的設(shè)備運(yùn)行情況,以及計算任務(wù)量來選擇適當(dāng)?shù)臅r機(jī)進(jìn)入休眠或者喚醒設(shè)備。我們可以通過以下方法來設(shè)置設(shè)備的休眠狀態(tài):
(1)在一定的時間里面,設(shè)備的驅(qū)動沒有對設(shè)備進(jìn)行相應(yīng)的訪問,或者設(shè)備沒有產(chǎn)生相應(yīng)的數(shù)據(jù)信息。按照嵌入式Linux系統(tǒng)的電源管理規(guī)范,進(jìn)行讀寫設(shè)備前調(diào)用pm.access,原Linux系統(tǒng)中該函數(shù)是空函數(shù)需要用戶自行定義。我們在該函數(shù)中刷新last.access.time值。我們可以通過計算當(dāng)前值和last.access.time值,可以知道設(shè)備有多久沒有被訪問過。
(2)當(dāng)嵌入式Linux外部設(shè)備需要進(jìn)入休眠狀態(tài)時候,會可以調(diào)用pm.dev.idle聲明該設(shè)備處于空閑狀態(tài)中。Linux系統(tǒng)中,pm.dev.idle也是空函數(shù),需要用戶自行實現(xiàn)。我們可以利用該函數(shù)接口來修改pm.dev結(jié)構(gòu)的flags。該標(biāo)志記錄了設(shè)備發(fā)送的所有請求。
(3)處理器CPU在進(jìn)入休眠模式之前會通知所有的外圍設(shè)備,外圍設(shè)備接收到該通知會執(zhí)行設(shè)備睡眠程序,然后進(jìn)入睡眠模式。
嵌入式系統(tǒng)在功耗方面的分布如圖2所示,處理器在系統(tǒng)中的功耗占據(jù)了很大一部分,特別是不帶LCD顯示模塊的系統(tǒng)中。因此如何管理處理器的功耗是嵌入式系統(tǒng)的重點之一。通常情況下,我們可以通過下面的三種途徑:
(1)根據(jù)系統(tǒng)負(fù)荷大小調(diào)整處理器時鐘的頻率,負(fù)荷較小時降低處理器的時鐘速度及其電壓。
(2)當(dāng)當(dāng)前的處理器處于空閑狀態(tài)時候,設(shè)置處理器為空閑模式。
(3)系統(tǒng)關(guān)閉時候,設(shè)置處理器為休眠模式。
2.2.1 嵌入式處理器功耗控制
因為嵌入式處理器的功耗與其性能是正相關(guān)的,因此控制嵌入式處理器功耗就是控制處理器的性能大小,同理,處理器的性能與其時鐘頻率又是正相關(guān)的,因此我們最終是控制嵌入式處理器的時鐘頻率。大多數(shù)處理器都會有相應(yīng)的寄存器來設(shè)置其時鐘頻率。我們可以在該函數(shù)中實現(xiàn)對處理器的運(yùn)行時鐘進(jìn)行更改,以達(dá)到降低處理器功耗的效果。我們可以利用Linux內(nèi)核當(dāng)中的cpufreq.set函數(shù),該函數(shù)在Kernel/cpufreq.c中實現(xiàn)。
實現(xiàn)的功耗調(diào)整需要在適當(dāng)?shù)臅r機(jī)更改CPU的時鐘速度。我們可以通過調(diào)整CPU的運(yùn)行頻率來改變系統(tǒng)功耗和系統(tǒng)執(zhí)行任務(wù)所需要的時間,比如,如果我們降低CPU的運(yùn)行頻率,會降低CPU的功耗,但同時會增加CPU執(zhí)行任務(wù)的時間;如果我們提高CPU的運(yùn)行速率的時候,會增加系統(tǒng)的功耗,同時提高系統(tǒng)性能,減少任務(wù)執(zhí)行時間。這就需要用戶自行決定在功耗和性能之間做個選擇。我們可以通過cpufreq.sysctl函數(shù)提供的sysctl接口,在運(yùn)行代碼中更改,也可以通過系統(tǒng)腳本的方式改變系統(tǒng)文件來更改CPU的主頻。
2.2.2 設(shè)置處理器空閑模式
當(dāng)處理器處于空閑狀態(tài)時候,我們可以設(shè)置處理器為空閑模式,以降低嵌入式系統(tǒng)功耗。此時嵌入式系統(tǒng)外設(shè)仍然是工作的,只是CPU的時鐘會被關(guān)閉,直到有中斷將CPU從空閑狀態(tài)將CPU喚醒。通過cpu.do.idle函數(shù),修改處理器狀態(tài)為空閑狀態(tài)。
2.2.3 設(shè)置處理器睡眠模式
處理器睡眠模式可以將除了處理器時鐘和電源管理模塊以外,其他設(shè)備電源都關(guān)閉,此時系統(tǒng)處于一個較低功耗狀態(tài),直到特定事件將系統(tǒng)從睡眠狀態(tài)喚醒。
我們可以通過Linux中system.do.suspend和system.do.resume函數(shù)來實現(xiàn)使系統(tǒng)進(jìn)入休眠和喚醒系統(tǒng)的功能。system.do.suspend函數(shù)會調(diào)用pm.send.all來使所有的外圍設(shè)備進(jìn)入睡眠。system.do.resume函數(shù)會將數(shù)據(jù)從DRAM中導(dǎo)出,并恢復(fù)系統(tǒng)到suspend之前的狀態(tài)。
上面介紹了嵌入式Linux系統(tǒng)帶有的高級電源管理(Advanced Power Management,APM)技術(shù),高級電源管理(APM)技術(shù)基本已經(jīng)滿足大多數(shù)的應(yīng)用場景。如何有效的管理嵌入式系統(tǒng)電源功耗是一個很有意義的事情,下面我們介紹一種動態(tài)電源管理DPM(Dynamic Power Management)技術(shù),包含控制CPU的工作頻率以及電壓,外部總線的時鐘頻率,外部設(shè)備時鐘/電源等方面的動態(tài)調(diào)節(jié)以及管理等功能。更為智能的管理嵌入式系統(tǒng)電源功耗。
電路功耗等于動態(tài)功耗和靜態(tài)功耗相加。
其中P為總功耗,C電容,V電壓,f開關(guān)頻率,I漏電流。
從上公式我們可以得到下面三種管理功耗的方法:
(1)調(diào)節(jié)電壓/時鐘。我們可以通過調(diào)節(jié)電壓V和時鐘來調(diào)節(jié)功耗;
(2)時鐘選通f(Clock Gating)。我們可以通過控制時鐘斷開和開通來控制設(shè)備在運(yùn)行和閑置狀態(tài);
(3)電源的連接和斷開(Power Gating)。我們可以控制設(shè)備電源的開通來使設(shè)備電源處于運(yùn)行狀態(tài),斷開電源停止設(shè)備運(yùn)行。
上面的理論基礎(chǔ)使我們動態(tài)管理嵌入式Linux系統(tǒng)電源成為可能。
嵌入式Linux系統(tǒng)有不同的運(yùn)行形態(tài),而每種狀態(tài)有不一樣的電源等級需求。圖3顯示了Linux有不一樣的運(yùn)行狀態(tài),并且每種狀態(tài)之間的轉(zhuǎn)換和任務(wù)之間的聯(lián)系。
我們可以將嵌入式Linux系統(tǒng)動態(tài)管理分為三類:
(1)系統(tǒng)掛起/恢復(fù)。用于減少產(chǎn)品設(shè)備長時間空閑情況下,減少電源功耗。
(2)設(shè)備電源管理。用來關(guān)斷或者開通設(shè)備電源,以達(dá)到控制設(shè)備功耗的目的。
(3)平臺動態(tài)管理。用來管理系統(tǒng)頻繁發(fā)生的電源狀態(tài)切換。
圖3:操作狀態(tài)間的轉(zhuǎn)換
圖4:嵌入式內(nèi)核電源動態(tài)管理
我們可以將嵌入式內(nèi)核電源動態(tài)管理分為三層:應(yīng)用層、內(nèi)核層和硬件設(shè)備層。如圖4所示。
應(yīng)用層:我們可以使用嵌入式Linux系統(tǒng)提供的sysfs文件系統(tǒng)以及設(shè)備驅(qū)動系統(tǒng)模型來進(jìn)行電源的動態(tài)管理。通過修改任務(wù)宏swith_to,實現(xiàn)dpm_set_os(dpm__state)接口來實現(xiàn)當(dāng)前硬件參數(shù)的設(shè)置。
內(nèi)核層:內(nèi)核層提供了硬件無關(guān)的電源管理邏輯控制框架。此層我們主要是實現(xiàn)對底層的硬件細(xì)節(jié)的屏蔽,以及向應(yīng)用層提供相應(yīng)的API接口,和銜接應(yīng)用層和具體硬件。
硬件設(shè)備層:此層主要是為電源動態(tài)管理機(jī)制提供需要的硬件基礎(chǔ)。主要對應(yīng)的是各種硬件總線和設(shè)備時鐘。
本文介紹了嵌入式電源硬件系統(tǒng),嵌入式Linux系統(tǒng)的高級電源管理系統(tǒng),以及通過高級電源管理系統(tǒng)進(jìn)行嵌入式系統(tǒng)的電源管理,嵌入式Linux系統(tǒng)的高級電源管理系統(tǒng)可以應(yīng)對大部分的應(yīng)用場景。但人們總是追求更加完善的方案,因此在本文后面介紹了動態(tài)電源管理系統(tǒng),以更加智能的方式管理嵌入式系統(tǒng)的電源功耗。對于嵌入式系統(tǒng)的電源管理我們還有很多需要完善的地方,比如我們可以根據(jù)軟硬件來收集系統(tǒng)的負(fù)荷,進(jìn)一步更加精確的調(diào)整系統(tǒng)功耗。電源管理和嵌入式系統(tǒng)實時性能之間的關(guān)系需要更進(jìn)一步的協(xié)調(diào)處理等。