趙婉芳
摘 要:本文主要針對LINUX嵌入式系統(tǒng)的電源管理部分,分析了目前存在的主要的電源管理技術(shù),重點(diǎn)研究了LINUX系統(tǒng)中當(dāng)系統(tǒng)處于空閑狀態(tài)時負(fù)責(zé)電源管理的CPUIDLE模塊結(jié)構(gòu)特點(diǎn)以及接口核心編碼,對基于LINUX系統(tǒng)的電源管理研究有一定的參考意義。
關(guān)鍵詞:LINUX系統(tǒng);CPUIDLE模塊;接口
中圖分類號:TP368 文獻(xiàn)標(biāo)識碼:A 文章編號:1671-2064(2017)22-0019-01
隨著移動互聯(lián)技術(shù)的發(fā)展,越來越多的便攜式移動終端被鏈接入網(wǎng),對于移動終端的待機(jī)時長,安全性和穩(wěn)定性提出了更高的要求,由于便攜式終端具有移動性強(qiáng),體積小的特點(diǎn),主要選擇使用電池供電,因此如何對具有電能消耗的嵌入式系統(tǒng)進(jìn)行動態(tài)電源規(guī)劃管理,使得電池的壽命延長,最大限度的提升電能的使用率是該領(lǐng)域的研究熱點(diǎn)之一。
1 電源管理技術(shù)
目前電源管理技術(shù)主要分為靜態(tài)電源管理和動態(tài)電源管理兩種方式。靜態(tài)電源管理(SPM)主要使用在PC機(jī)端,目前有兩個工業(yè)標(biāo)準(zhǔn),分別是高級電源管理APM和高級配置和電源管理接口ACPI,在兩個標(biāo)準(zhǔn)中都對靜態(tài)電源管理的實(shí)現(xiàn)進(jìn)行了詳細(xì)的狀態(tài)定義。靜態(tài)電源管理的基本思想是把系統(tǒng)看作一個有限狀態(tài)機(jī),其中包括多種工作狀態(tài),每種工作狀態(tài)對應(yīng)一個參數(shù)集合,這個參數(shù)集合表示的是該工作狀態(tài)下的功耗和性能參數(shù)等。系統(tǒng)可以根據(jù)自身的負(fù)載情況在各個工作狀態(tài)之間進(jìn)行切換,也可以由用戶根據(jù)自身需要進(jìn)行某個工作狀態(tài)的設(shè)置。當(dāng)系統(tǒng)空閑,零負(fù)載或者負(fù)載比較小的時候,系統(tǒng)就會控制設(shè)備進(jìn)入低性能狀態(tài)或者低功耗狀態(tài),當(dāng)系統(tǒng)請求較多,負(fù)載較高時,系統(tǒng)就會控制設(shè)備進(jìn)入高性能狀態(tài)或者高功耗狀態(tài)。系統(tǒng)主要的四個狀態(tài)為:正常運(yùn)行態(tài),待機(jī)態(tài),掛起態(tài),深度休眠態(tài)。
動態(tài)電源管理(DPM)則廣泛應(yīng)用于嵌入式移動終端設(shè)備,是一種系統(tǒng)級的功耗控制技術(shù)。動態(tài)電源管理的基本思想是設(shè)想系統(tǒng)由多個部件組成,每個部件可以有多種工作狀態(tài),每種工作狀態(tài)對應(yīng)著不同的電壓和時鐘頻率,因此有著不同的功率消耗。動態(tài)電源管理主要依據(jù)系統(tǒng)運(yùn)行時各部件的具體負(fù)載情況,調(diào)整設(shè)備進(jìn)入適合的功耗狀態(tài),以此來節(jié)省功耗。由于動態(tài)管理系統(tǒng)隨時在繁忙和空閑等工作狀態(tài)之間進(jìn)行切換,在進(jìn)入和退出工作狀態(tài)時會帶來一定的延時,因此,如果狀態(tài)切換太過頻繁,帶來的延時會抵消節(jié)省功耗帶來的益處,降低系統(tǒng)性能。所以在動態(tài)電源管理中,最重要的是選擇好正確的管理策略,取得功耗和延時及性能之間的最佳平衡點(diǎn)。動態(tài)電源管理策略通常分為四種類型:(1)超時策略;(2)貪婪策略;(3)基于隨機(jī)過程策略;(4)預(yù)測策略。
2 CPUIDLE模塊
Linux系統(tǒng)中,支持CPU電源管理的模塊主要分為CpuIdle和cpufreq兩個模塊,當(dāng)系統(tǒng)處于空閑狀態(tài)時主要由cpuidle framework來負(fù)責(zé)管理這種空閑狀態(tài)時的電源功耗,當(dāng) CPU活躍時,則由cpufreq模塊來負(fù)責(zé)管理電源的使用。在Linux內(nèi)核中,cpuidle架構(gòu)位于“drivers/cpuidle”文件夾中,分別包含三個模塊,分別為:cpuidle core:負(fù)責(zé)實(shí)現(xiàn)cpuidle framework的整體框架;cpuidle governors:負(fù)責(zé)管理方案的選??; cpuidle drivers:定義每一個狀態(tài)的功耗和延遲分別是多少并負(fù)責(zé)idle機(jī)制的實(shí)現(xiàn),即:如何進(jìn)入idle狀態(tài),什么條件下會退出,等等。以上三個模塊再結(jié)合位于kernel sched中的cpuidle entry,共同完成cpu的空閑管理,CpuIdle模塊的軟件結(jié)構(gòu)如圖1所示。
在cpuidle架構(gòu)中最重要的就是cpuidle governor部分,它負(fù)責(zé)具體電源管理方案的選取,因此電源管理是否有效,關(guān)鍵在于governor的配置使用。在當(dāng)前的系統(tǒng)內(nèi)核中CpuIdle模塊主要有兩個governor部件,分別為ladder governor和menu governor,它們分別使用于不同的系統(tǒng)中。對于現(xiàn)在的大部分系統(tǒng),由于電源管理的原因以及延遲容忍度的處理,大多系統(tǒng)都是使用menu governor來選擇一個合適的空閑狀態(tài)。在menu governor工作過程中,其綜合考慮并計(jì)算系統(tǒng)切換不同狀態(tài)時所花費(fèi)的功耗以及帶來的延遲容忍程度,最終來選擇所要進(jìn)入的空閑狀態(tài),因此該部分是cpuidle模塊中電源管理的核心部分,如何使用該部分成為系統(tǒng)處于空閑狀態(tài)是時能否達(dá)到最佳節(jié)能目的關(guān)鍵。
3 governor接口
Governor的使用是通過接口程序來實(shí)現(xiàn)的,cpuidle_ governor結(jié)接口程序通過cpuidle core使用struct cpuidle_ governor結(jié)構(gòu)抽象得到,以下是governor的標(biāo)準(zhǔn)接口程序:
struct cpuidle_governor {
char name[CPUIDLE_NAME_LEN];
struct list_head governor_list;
int (*init) (struct cpuidle_device *dev);
void (*exit) (struct cpuidle_device *dev);
void (*scan) (struct cpuidle_device *dev);
int (*select) (struct cpuidle_device *dev);
void (*reflect) (struct cpuidle_device *dev);
struct module *owner;
};
其中,由cpuidle調(diào)用init()方法來初始化控制器;
調(diào)用exit()方法可以退出控制器;
scan()方法用于重新檢測設(shè)備所處的狀態(tài)。這樣能保證及時獲取到狀態(tài)的變化;
select() 方法在系統(tǒng)進(jìn)入空閑狀態(tài)之前被調(diào)用,該方法根據(jù)當(dāng)前系統(tǒng)的運(yùn)行狀況,以及各個idle state的特性,選擇一個決策;
cpuidle_register_governor()方法和cpuidle_unregister _governor()方法用于注冊或注銷一個cpuidle governor;
reflect()是個回調(diào)函數(shù),通過該函數(shù)告知governor,系統(tǒng)上一次所處的空閑狀態(tài)是哪一個(即系統(tǒng)從哪一個state回來)。
4 結(jié)語
隨著物聯(lián)網(wǎng)的發(fā)展,對于終端電源的能耗將要求越來越高,電源管理將會成為行業(yè)發(fā)展的關(guān)鍵點(diǎn)。本文主要分析了目前存在的靜態(tài)和動態(tài)電源管理技術(shù),研究了LINUX系統(tǒng)中當(dāng)系統(tǒng)處于空閑狀態(tài)時負(fù)責(zé)電源管理的CPUIDLE模塊結(jié)構(gòu)特點(diǎn)以及接口核心編碼,對基于LINUX系統(tǒng)的電源管理方面研究有一定的參考意義。
參考文獻(xiàn)
[1]鄒思軼.嵌入式Linux設(shè)計(jì)與應(yīng)用[M].北京:清華大學(xué)出版社,2001.
[2]許海燕,付炎.嵌入式系統(tǒng)技術(shù)和應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2002.