一種利用實(shí)時(shí)時(shí)鐘降低嵌入式系統(tǒng)功耗的方法
1.嵌入式CPU低功耗模式介紹
本文引用地址:http://m.butianyuan.cn/article/201609/304522.htm眾所周知,低功耗已經(jīng)是衡量一個(gè)嵌入式系統(tǒng)的重要指標(biāo)。而作為嵌入式系統(tǒng)的核心,嵌入式CPU的功耗則對(duì)整個(gè)系統(tǒng)起著重要的作用。當(dāng)前流行的嵌入式系統(tǒng)CPU,基本都提供低功耗特性。一般而言,當(dāng)嵌入式CPU都會(huì)有工作模式與低功耗模式,而低功耗模式又可進(jìn)一步分為空閑模式,休眠模式,睡眠模式等。進(jìn)入低功耗模式后,CPU的功耗會(huì)降低很多。而外部中斷發(fā)生時(shí),可以將CPU喚醒。一個(gè)嵌入式系統(tǒng)運(yùn)行起來后,當(dāng)系統(tǒng)進(jìn)入idle狀態(tài)時(shí),就可以讓CPU進(jìn)入低功耗模式,而當(dāng)外部中斷發(fā)生時(shí),再喚醒CPU,重新回到工作模式。讓CPU盡可能多的處于低功耗模式,可以大大降低系統(tǒng)的功耗。然而,即使系統(tǒng)處于idle而且沒有別的工作要做,系統(tǒng)實(shí)時(shí)時(shí)鐘的中斷,也會(huì)不停的喚醒CPU,從而增加系統(tǒng)功耗。因此,可以考慮對(duì)系統(tǒng)實(shí)時(shí)時(shí)鐘的中斷進(jìn)行修改,從而減少對(duì)系統(tǒng)功耗的影響。
2.系統(tǒng)實(shí)時(shí)時(shí)鐘與功耗的關(guān)系分析
在目前的嵌入式系統(tǒng)中,系統(tǒng)實(shí)時(shí)時(shí)鐘一般是一個(gè)硬件循環(huán)計(jì)數(shù)器。當(dāng)硬件計(jì)數(shù)器計(jì)到一定數(shù)值時(shí)會(huì)向CPU發(fā)出中斷。系統(tǒng)實(shí)時(shí)時(shí)鐘是現(xiàn)代多任務(wù)嵌入式操作系統(tǒng)的重要組成部分,因此我們需要先討論一下嵌入式操作系統(tǒng)與系統(tǒng)實(shí)時(shí)時(shí)鐘的關(guān)系。當(dāng)今的嵌入式操作系統(tǒng)一般都支持多任務(wù),優(yōu)先級(jí)和時(shí)間片調(diào)度。
當(dāng)嵌入式OS運(yùn)行起來后,一般都有一個(gè)IDLE任務(wù),它的優(yōu)先級(jí)最低,而其他任務(wù)的優(yōu)先級(jí)都應(yīng)該比它高。在優(yōu)先級(jí)調(diào)度機(jī)制中,只有當(dāng)系統(tǒng)中其他高優(yōu)先級(jí)任務(wù)都處于阻塞狀態(tài)時(shí),它才有機(jī)會(huì)運(yùn)行。時(shí)間片調(diào)度機(jī)制只對(duì)同優(yōu)先級(jí)的任務(wù)有效。也就是說,不同優(yōu)先級(jí)的任務(wù)之間是不會(huì)按時(shí)間片調(diào)度輪轉(zhuǎn)的,而是按優(yōu)先級(jí)來調(diào)度的。因此當(dāng)系統(tǒng)進(jìn)入IDLE任務(wù)時(shí),可以認(rèn)為系統(tǒng)中沒有工作要CPU來做,系統(tǒng)為idle狀態(tài)。當(dāng)時(shí)間片調(diào)度機(jī)制開啟后,嵌入式OS就會(huì)根據(jù)時(shí)間片來調(diào)度任務(wù)。
也就是當(dāng)一個(gè)時(shí)間片用完后,要運(yùn)行調(diào)度器來決定下一個(gè)時(shí)間片的歸屬。時(shí)間片的基本單位是系統(tǒng)tick,而系統(tǒng)tick是以系統(tǒng)實(shí)時(shí)時(shí)鐘為基礎(chǔ)的。當(dāng)系統(tǒng)實(shí)時(shí)時(shí)鐘中斷產(chǎn)生時(shí),CPU會(huì)將系統(tǒng)tick加1。每當(dāng)系統(tǒng)tick增加n(一個(gè)時(shí)間片)時(shí),嵌入式OS將啟用調(diào)度器進(jìn)行時(shí)間片調(diào)度。因此,當(dāng)時(shí)間片調(diào)度機(jī)制開啟后,就需要系統(tǒng)tick的實(shí)時(shí)更新和調(diào)度器的定時(shí)運(yùn)行,也就需要實(shí)時(shí)時(shí)鐘中斷以很高的頻率定時(shí)產(chǎn)生。如果關(guān)閉時(shí)間片調(diào)度機(jī)制,則任務(wù)之間只需要按照優(yōu)先級(jí)來調(diào)度,這樣就不需要計(jì)算時(shí)間片,也就是系統(tǒng)tick不用實(shí)時(shí)更新,實(shí)時(shí)時(shí)鐘的中斷不必以很高的頻率產(chǎn)生,調(diào)度器也不用定時(shí)運(yùn)行。這樣就有可能考慮延長(zhǎng)實(shí)時(shí)時(shí)鐘的中斷間隔。
同時(shí)調(diào)度器不需要進(jìn)行時(shí)間片調(diào)度,可以節(jié)省系統(tǒng)開銷。但關(guān)閉時(shí)間片調(diào)度后,系統(tǒng)就只有優(yōu)先級(jí)調(diào)度。這就要求系統(tǒng)的所有任務(wù)要主動(dòng)阻塞,而不要期待調(diào)度器把同優(yōu)先級(jí)的其他任務(wù)調(diào)度出CPU而讓自己運(yùn)行。在目前流行的嵌入式操作系統(tǒng)中,一般都提供了很多主動(dòng)阻塞的機(jī)制,因此要做到這一點(diǎn)并不難。延長(zhǎng)實(shí)時(shí)時(shí)鐘的中斷間隔,可以讓CPU長(zhǎng)期處于低功耗狀態(tài),直到有設(shè)備中斷喚醒CPU。這樣將大大減低系統(tǒng)在空閑時(shí)的功耗。
延長(zhǎng)實(shí)時(shí)時(shí)鐘中斷間隔后,需要考慮的問題有兩個(gè),一是系統(tǒng)tick,另一個(gè)是系統(tǒng)delay。系統(tǒng)tick是實(shí)時(shí)時(shí)鐘和操作系統(tǒng)之間的接口,操作系統(tǒng)與時(shí)間相關(guān)的模塊和API,基本都是基于tick的。在一般系統(tǒng)中,實(shí)時(shí)時(shí)鐘的中斷是每個(gè)tick一次。因此tick是操作系統(tǒng)最小的計(jì)時(shí)單位。延長(zhǎng)實(shí)時(shí)時(shí)鐘中斷間隔后,系統(tǒng)tick就會(huì)長(zhǎng)時(shí)間不增加,因此怎樣保證系統(tǒng)tick的準(zhǔn)確性,就是最基本的問題。解決了tick的準(zhǔn)確性,就可以隔離實(shí)時(shí)時(shí)鐘對(duì)操作系統(tǒng)的影響。系統(tǒng)delay是操作系統(tǒng)一種重要的阻塞機(jī)制,它主要用于讓一個(gè)任務(wù)主動(dòng)讓出CPU一段時(shí)間。
一般系統(tǒng)delay是基于系統(tǒng)實(shí)時(shí)時(shí)鐘的,系統(tǒng)delay的基本單位就是tick。當(dāng)調(diào)用delay時(shí),API函數(shù)會(huì)首先得到當(dāng)前系統(tǒng)tick,然后加上需要delay的時(shí)間,形成一個(gè)未來的delay時(shí)間點(diǎn),再將任務(wù)掛到系統(tǒng)的delay隊(duì)列上。因此delay隊(duì)列上的所有任務(wù)都對(duì)應(yīng)一個(gè)自己的delay時(shí)間點(diǎn)。當(dāng)系統(tǒng)tick超過某個(gè)任務(wù)的delay時(shí)間點(diǎn)時(shí),該任務(wù)就應(yīng)該醒來。這就需要實(shí)時(shí)時(shí)鐘的中斷來喚醒CPU,并運(yùn)行調(diào)度器讓delay的任務(wù)重新進(jìn)入就緒隊(duì)列。
如果實(shí)時(shí)時(shí)鐘中斷間隔延長(zhǎng),系統(tǒng)tick就會(huì)很長(zhǎng)時(shí)間不增加,就很難保證delay的準(zhǔn)確性。同時(shí)delay時(shí)間到達(dá)后,也無法喚醒任務(wù)。要保證系統(tǒng)tick的準(zhǔn)確性,就要求每次主動(dòng)獲得系統(tǒng)tick時(shí),需要通過實(shí)時(shí)時(shí)鐘硬件計(jì)數(shù)器的值計(jì)算出當(dāng)前的系統(tǒng)tick。
同時(shí),需要保證主動(dòng)獲取和實(shí)時(shí)時(shí)鐘中斷之間的同步。而對(duì)于系統(tǒng)delay,則需要修改硬件計(jì)數(shù)器的計(jì)數(shù)值,使其為系統(tǒng)delay隊(duì)列上的最小delay時(shí)間點(diǎn)的delay時(shí)間。這樣可以利用硬件計(jì)數(shù)器來準(zhǔn)確控制delay的準(zhǔn)確性,并且利用中斷來及時(shí)調(diào)度任務(wù)。
3.在I.MX51上的解決方案:
ECOS是一款優(yōu)秀的輕量級(jí)嵌入式操作系統(tǒng),它的內(nèi)核微小,緊湊,支持多任務(wù),優(yōu)先級(jí)和時(shí)間片調(diào)度機(jī)制。飛思卡爾的多媒體芯片i.mx51基于ARM Cortex-A8核,具有很高的性能,同時(shí)支持了ARM提供的低功耗功能。ARM提供低功耗模式,即睡眠模式。ARM執(zhí)行指令WFI后,會(huì)進(jìn)入睡眠狀態(tài)。
在睡眠模式下,ARM的時(shí)鐘被關(guān)閉,ARM只消耗極低的功耗來維護(hù)自身的狀態(tài),即啟用SRPG(State retaining power gate)。當(dāng)有中斷發(fā)生時(shí),ARM會(huì)被喚醒,恢復(fù)時(shí)鐘,重新開始執(zhí)行。MX51提供了多個(gè)硬件計(jì)數(shù)器,本文采用其中的GPT作為實(shí)時(shí)時(shí)鐘。GPT是一個(gè)循環(huán)計(jì)數(shù)器,可以設(shè)置最大為0xffffffff的計(jì)數(shù)值,每個(gè)時(shí)鐘計(jì)數(shù)值減1,當(dāng)計(jì)數(shù)值減到0時(shí)觸發(fā)中斷,時(shí)鐘為32KHz。GPT的計(jì)數(shù)值可以在任意時(shí)刻被ARM讀取,讀取是不影響計(jì)數(shù)的。
當(dāng)IDLE任務(wù)運(yùn)行時(shí),IDLE就執(zhí)行WFI指令,讓ARM進(jìn)入低功耗模式。如果有設(shè)備產(chǎn)生中斷,ARM就會(huì)被喚醒,處理中斷以及所需的任務(wù)調(diào)度,任務(wù)運(yùn)行。基于前面的分析,本文對(duì)ECOS的時(shí)間片調(diào)度和實(shí)時(shí)時(shí)鐘系統(tǒng)進(jìn)行了修改。對(duì)于時(shí)間片調(diào)度機(jī)制,在ECOS的配置文件中將其關(guān)閉。對(duì)于實(shí)時(shí)時(shí)鐘,則延長(zhǎng)了它的中斷間隔。系統(tǒng)tick在兩種情況下會(huì)被更新,一種是當(dāng)調(diào)用ECOS API去讀系統(tǒng)tick的時(shí)候,另一種就是GPT產(chǎn)生中斷。當(dāng)ECOS啟動(dòng)后,將GPT的計(jì)數(shù)值設(shè)為最大,這樣GPT就需要很長(zhǎng)時(shí)間才會(huì)產(chǎn)生一次中斷。在這期間,系統(tǒng)tick只會(huì)在ECOS API主動(dòng)讀取時(shí)才會(huì)更新。系統(tǒng)tick的更新是通過讀取硬件計(jì)數(shù)器的計(jì)數(shù)值計(jì)算出來的。
評(píng)論