嵌入式系統(tǒng)降低功耗的方法研究
另一種常用的時鐘技術(shù)就是可變頻率時鐘。它可根據(jù)系統(tǒng)性能要求,配置適當(dāng)?shù)臅r鐘頻率以避免不必要的功耗。門控時鐘實際上是可變頻率時鐘的一種極限情況(即只有0和最高頻率兩種值),因此,可變頻率時鐘比門控時鐘技術(shù)更加有效,但需要系統(tǒng)內(nèi)嵌時鐘產(chǎn)生模塊PLL,增加了設(shè)計復(fù)雜度。圖4為在具有低功耗特性的嵌入式芯片上進(jìn)行的時鐘系統(tǒng)設(shè)計方案。片上時鐘系統(tǒng)通過2個數(shù)字鎖相環(huán)CPUPLL和SysPLL來穩(wěn)定16 MHz的輸入時鐘,分別送到不同的倍頻器和分頻器。經(jīng)CPU-PLL的時鐘信號作為處理器內(nèi)核時鐘,經(jīng)SysPLL的時鐘信號作為處理器內(nèi)核之外的系統(tǒng)時鐘、存儲器時鐘和外設(shè)時鐘。
由于處理器芯片(如i.MX1)不支持電壓動態(tài)調(diào)節(jié),可通過配置片內(nèi)數(shù)字鎖相環(huán)實現(xiàn)內(nèi)核頻率動態(tài)調(diào)節(jié)。根據(jù)公式計算出系統(tǒng)頻率:
其中:fref是系統(tǒng)的低頻時鐘頻率,作為倍頻的參考頻率;MFI是倍頻因子的整數(shù)部分;MFN和MFD分別是倍頻因子的分子和分母;PD是預(yù)設(shè)分頻因子。
2.2 操作系統(tǒng)層
系統(tǒng)級低功耗設(shè)計一般是在操作系統(tǒng)層實現(xiàn)。因為操作系統(tǒng)管理系統(tǒng)所有軟硬件資源,并獲取系統(tǒng)的各種狀態(tài)信息,控制硬件設(shè)備的狀態(tài)。因此,在操作系統(tǒng)中實現(xiàn)全局功耗控制是最佳選擇。操作系統(tǒng)層面分成功耗驅(qū)動模塊和功耗調(diào)度模塊。
2.2.1 功耗驅(qū)動模塊
驅(qū)動模塊實現(xiàn)相對簡單,主要是對硬件操作。功耗模式轉(zhuǎn)換和頻率調(diào)節(jié)都是通過片上時鐘系統(tǒng)控制寄存器進(jìn)行設(shè)置。因此,實質(zhì)上是對寄存器的設(shè)置。從睡眠模式或停止模式進(jìn)入運行模式相對容易,只需向系統(tǒng)發(fā)出中斷信號,喚醒系統(tǒng)進(jìn)入運行模式。而從運行模式到睡眠模式或停止模式相對復(fù)雜,其關(guān)鍵代碼如下:
2.2.2 功耗調(diào)度模塊
功耗調(diào)度模塊實現(xiàn)的關(guān)鍵技術(shù)在嵌入式Linux操作系統(tǒng)中有具體體現(xiàn)。在Linux操作系統(tǒng)中,任務(wù)的調(diào)度主要由進(jìn)程調(diào)度(或任務(wù)調(diào)度)模塊 schedule()完成。schedule()掌握系統(tǒng)內(nèi)所有進(jìn)程的運行狀態(tài),并對其執(zhí)行的優(yōu)先級進(jìn)行管理調(diào)度。因此,系統(tǒng)級實現(xiàn)功耗控制,需要對嵌入式Linux內(nèi)核的schedule()模塊全面改寫,將DPM和DVS策略加入其中。設(shè)計思路為:由于Linux內(nèi)核提供的 cpu_usage_stat結(jié)構(gòu)記錄了處理器運行時間的分配情況,可以通過讀取這些參數(shù)計算出當(dāng)前系統(tǒng)的運行比例,即通過cpu_scan函數(shù)來實現(xiàn)具體的操作。cpu_scan函數(shù)是處理器設(shè)備驅(qū)動的主要部分,它在固定的時間片內(nèi)調(diào)用,時間片的大小可以根據(jù)需要在5~1D0 ms之間選取。該函數(shù)通過調(diào)用cpu_dvs函數(shù)和cpu_dmp函數(shù)來評估系統(tǒng)的狀態(tài),這兩個函數(shù)分別是可變電壓技術(shù)和動態(tài)功耗管理的實現(xiàn)。
(1)DPM策略
DPM策略在低功耗嵌入式Linux系統(tǒng)的實現(xiàn)上分為觀測器和控制器兩部分,如圖5所示。我們在實現(xiàn)過程中采用了Timeout算法。該算法實現(xiàn)簡單,預(yù)測準(zhǔn)確性也較高。統(tǒng)計表明,只要合理地設(shè)計Timeout,這種假設(shè)的可信度為95%。采用了Timeout算法的cpu_dmp函數(shù)在此不再具體解釋。但在動態(tài)電源管理實現(xiàn)過程中容易出現(xiàn)一個喚醒信號發(fā)送給一個等待隊列中的進(jìn)程后,該進(jìn)程不能夠立即被調(diào)度執(zhí)行,從而造成事件丟失的情況。為了避免這種情況的出現(xiàn),Llow被設(shè)置成比Lmax稍小的值。當(dāng)事件數(shù)量到達(dá)Llow時,即使事件處理進(jìn)程被喚醒后不能馬上轉(zhuǎn)入執(zhí)行,由于LlowLmax,事件列表還沒有全滿,也不會造成新事件丟失。這樣,既降低了事件丟失的幾率,對系統(tǒng)的影響也降到了最小,因為只有當(dāng)事件列表快滿時才會調(diào)用事件處理進(jìn)程。
評論