<s id="eoqoe"><xmp id="eoqoe">
<button id="eoqoe"><strong id="eoqoe"></strong></button>
<s id="eoqoe"><xmp id="eoqoe">
<button id="eoqoe"><strong id="eoqoe"></strong></button>
<wbr id="eoqoe"></wbr>
<wbr id="eoqoe"><strong id="eoqoe"></strong></wbr>
<wbr id="eoqoe"><strong id="eoqoe"></strong></wbr>
<wbr id="eoqoe"><strong id="eoqoe"></strong></wbr>
<wbr id="eoqoe"><label id="eoqoe"></label></wbr>
<button id="eoqoe"></button>
<wbr id="eoqoe"></wbr>
你的位置:首頁(yè) > 測試測量 > 正文

一種利用實(shí)時(shí)時(shí)鐘降低嵌入式系統功耗的方法

發(fā)布時(shí)間:2014-09-16 責任編輯:sherryyu

【導讀】眾所周知,低功耗已經(jīng)是衡量一個(gè)嵌入式系統的重要指標。而作為嵌入式系統的核心,嵌入式CPU的功耗則對整個(gè)系統起著(zhù)重要的作用。本文介紹一種利用實(shí)時(shí)時(shí)鐘降低嵌入式系統功耗的方法,供大家參考學(xué)習。
 
1.嵌入式CPU低功耗模式介紹
 
眾所周知,低功耗已經(jīng)是衡量一個(gè)嵌入式系統的重要指標。而作為嵌入式系統的核心,嵌入式CPU的功耗則對整個(gè)系統起著(zhù)重要的作用。當前流行的嵌入式系統CPU,基本都提供低功耗特性。一般而言,當嵌入式CPU都會(huì )有工作模式與低功耗模式,而低功耗模式又可進(jìn)一步分為空閑模式,休眠模式,睡眠模式等。進(jìn)入低功耗模式后,CPU的功耗會(huì )降低很多。而外部中斷發(fā)生時(shí),可以將CPU喚醒。一個(gè)嵌入式系統運行起來(lái)后,當系統進(jìn)入idle狀態(tài)時(shí),就可以讓CPU進(jìn)入低功耗模式,而當外部中斷發(fā)生時(shí),再喚醒CPU,重新回到工作模式。讓CPU盡可能多的處于低功耗模式,可以大大降低系統的功耗。然而,即使系統處于idle而且沒(méi)有別的工作要做,系統實(shí)時(shí)時(shí)鐘的中斷,也會(huì )不停的喚醒CPU,從而增加系統功耗。因此,可以考慮對系統實(shí)時(shí)時(shí)鐘的中斷進(jìn)行修改,從而減少對系統功耗的影響。
 
2.系統實(shí)時(shí)時(shí)鐘與功耗的關(guān)系分析
 
在目前的嵌入式系統中,系統實(shí)時(shí)時(shí)鐘一般是一個(gè)硬件循環(huán)計數器。當硬件計數器計到一定數值時(shí)會(huì )向CPU發(fā)出中斷。系統實(shí)時(shí)時(shí)鐘是現代多任務(wù)嵌入式操作系統的重要組成部分,因此我們需要先討論一下嵌入式操作系統與系統實(shí)時(shí)時(shí)鐘的關(guān)系。當今的嵌入式操作系統一般都支持多任務(wù),優(yōu)先級和時(shí)間片調度。當嵌入式OS運行起來(lái)后,一般都有一個(gè)IDLE任務(wù),它的優(yōu)先級最低,而其他任務(wù)的優(yōu)先級都應該比它高。在優(yōu)先級調度機制中,只有當系統中其他高優(yōu)先級任務(wù)都處于阻塞狀態(tài)時(shí),它才有機會(huì )運行。時(shí)間片調度機制只對同優(yōu)先級的任務(wù)有效。也就是說(shuō),不同優(yōu)先級的任務(wù)之間是不會(huì )按時(shí)間片調度輪轉的,而是按優(yōu)先級來(lái)調度的。因此當系統進(jìn)入IDLE任務(wù)時(shí),可以認為系統中沒(méi)有工作要CPU來(lái)做,系統為idle狀態(tài)。當時(shí)間片調度機制開(kāi)啟后,嵌入式OS就會(huì )根據時(shí)間片來(lái)調度任務(wù)。
 
也就是當一個(gè)時(shí)間片用完后,要運行調度器來(lái)決定下一個(gè)時(shí)間片的歸屬。時(shí)間片的基本單位是系統tick,而系統tick是以系統實(shí)時(shí)時(shí)鐘為基礎的。當系統實(shí)時(shí)時(shí)鐘中斷產(chǎn)生時(shí),CPU會(huì )將系統tick加1。每當系統tick增加n(一個(gè)時(shí)間片)時(shí),嵌入式OS將啟用調度器進(jìn)行時(shí)間片調度。因此,當時(shí)間片調度機制開(kāi)啟后,就需要系統tick的實(shí)時(shí)更新和調度器的定時(shí)運行,也就需要實(shí)時(shí)時(shí)鐘中斷以很高的頻率定時(shí)產(chǎn)生。如果關(guān)閉時(shí)間片調度機制,則任務(wù)之間只需要按照優(yōu)先級來(lái)調度,這樣就不需要計算時(shí)間片,也就是系統tick不用實(shí)時(shí)更新,實(shí)時(shí)時(shí)鐘的中斷不必以很高的頻率產(chǎn)生,調度器也不用定時(shí)運行。這樣就有可能考慮延長(cháng)實(shí)時(shí)時(shí)鐘的中斷間隔。同時(shí)調度器不需要進(jìn)行時(shí)間片調度,可以節省系統開(kāi)銷(xiāo)。但關(guān)閉時(shí)間片調度后,系統就只有優(yōu)先級調度。這就要求系統的所有任務(wù)要主動(dòng)阻塞,而不要期待調度器把同優(yōu)先級的其他任務(wù)調度出CPU而讓自己運行。在目前流行的嵌入式操作系統中,一般都提供了很多主動(dòng)阻塞的機制,因此要做到這一點(diǎn)并不難。延長(cháng)實(shí)時(shí)時(shí)鐘的中斷間隔,可以讓CPU長(cháng)期處于低功耗狀態(tài),直到有設備中斷喚醒CPU。
 
這樣將大大減低系統在空閑時(shí)的功耗。延長(cháng)實(shí)時(shí)時(shí)鐘中斷間隔后,需要考慮的問(wèn)題有兩個(gè),一是系統tick,另一個(gè)是系統delay。系統tick是實(shí)時(shí)時(shí)鐘和操作系統之間的接口,操作系統與時(shí)間相關(guān)的模塊和API,基本都是基于tick的。在一般系統中,實(shí)時(shí)時(shí)鐘的中斷是每個(gè)tick一次。因此tick是操作系統最小的計時(shí)單位。延長(cháng)實(shí)時(shí)時(shí)鐘中斷間隔后,系統tick就會(huì )長(cháng)時(shí)間不增加,因此怎樣保證系統tick的準確性,就是最基本的問(wèn)題。解決了tick的準確性,就可以隔離實(shí)時(shí)時(shí)鐘對操作系統的影響。系統delay是操作系統一種重要的阻塞機制,它主要用于讓一個(gè)任務(wù)主動(dòng)讓出CPU一段時(shí)間。一般系統delay是基于系統實(shí)時(shí)時(shí)鐘的,系統delay的基本單位就是tick。當調用delay時(shí),API函數會(huì )首先得到當前系統tick,然后加上需要delay的時(shí)間,形成一個(gè)未來(lái)的delay時(shí)間點(diǎn),再將任務(wù)掛到系統的delay隊列上。因此delay隊列上的所有任務(wù)都對應一個(gè)自己的delay時(shí)間點(diǎn)。當系統tick超過(guò)某個(gè)任務(wù)的delay時(shí)間點(diǎn)時(shí),該任務(wù)就應該醒來(lái)。這就需要實(shí)時(shí)時(shí)鐘的中斷來(lái)喚醒CPU,并運行調度器讓delay的任務(wù)重新進(jìn)入就緒隊列。如果實(shí)時(shí)時(shí)鐘中斷間隔延長(cháng),系統tick就會(huì )很長(cháng)時(shí)間不增加,就很難保證delay的準確性。同時(shí)delay時(shí)間到達后,也無(wú)法喚醒任務(wù)。要保證系統tick的準確性,就要求每次主動(dòng)獲得系統tick時(shí),需要通過(guò)實(shí)時(shí)時(shí)鐘硬件計數器的值計算出當前的系統tick。同時(shí),需要保證主動(dòng)獲取和實(shí)時(shí)時(shí)鐘中斷之間的同步。而對于系統delay,則需要修改硬件計數器的計數值,使其為系統delay隊列上的最小delay時(shí)間點(diǎn)的delay時(shí)間。這樣可以利用硬件計數器來(lái)準確控制delay的準確性,并且利用中斷來(lái)及時(shí)調度任務(wù)。
 
3.在I.MX51上的解決方案:
 
ECOS是一款優(yōu)秀的輕量級嵌入式操作系統,它的內核微小,緊湊,支持多任務(wù),優(yōu)先級和時(shí)間片調度機制。飛思卡爾的多媒體芯片i.mx51基于A(yíng)RM Cortex-A8核,具有很高的性能,同時(shí)支持了ARM提供的低功耗功能。ARM提供低功耗模式,即睡眠模式。ARM執行指令WFI后,會(huì )進(jìn)入睡眠狀態(tài)。在睡眠模式下,ARM的時(shí)鐘被關(guān)閉,ARM只消耗極低的功耗來(lái)維護自身的狀態(tài),即啟用SRPG(State retaining power gate)。當有中斷發(fā)生時(shí),ARM會(huì )被喚醒,恢復時(shí)鐘,重新開(kāi)始執行。MX51提供了多個(gè)硬件計數器,本文采用其中的GPT作為實(shí)時(shí)時(shí)鐘。GPT是一個(gè)循環(huán)計數器,可以設置最大為0xffffffff的計數值,每個(gè)時(shí)鐘計數值減1,當計數值減到0時(shí)觸發(fā)中斷,時(shí)鐘為32KHz。GPT的計數值可以在任意時(shí)刻被ARM讀取,讀取是不影響計數的。當IDLE任務(wù)運行時(shí),IDLE就執行WFI指令,讓ARM進(jìn)入低功耗模式。如果有設備產(chǎn)生中斷,ARM就會(huì )被喚醒,處理中斷以及所需的任務(wù)調度,任務(wù)運行?;谇懊娴姆治?,本文對ECOS的時(shí)間片調度和實(shí)時(shí)時(shí)鐘系統進(jìn)行了修改。對于時(shí)間片調度機制,在ECOS的配置文件中將其關(guān)閉。
 
對于實(shí)時(shí)時(shí)鐘,則延長(cháng)了它的中斷間隔。系統tick在兩種情況下會(huì )被更新,一種是當調用ECOS API去讀系統tick的時(shí)候,另一種就是GPT產(chǎn)生中斷。當ECOS啟動(dòng)后,將GPT的計數值設為最大,這樣GPT就需要很長(cháng)時(shí)間才會(huì )產(chǎn)生一次中斷。在這期間,系統tick只會(huì )在ECOS API主動(dòng)讀取時(shí)才會(huì )更新。系統tick的更新是通過(guò)讀取硬件計數器的計數值計算出來(lái)的。在ECOS系統的實(shí)時(shí)時(shí)鐘類(lèi)中增加一個(gè)變量pre_hardware_count用于記錄上一次讀取的硬件計數器的值。當每次系統API讀取tick時(shí),當前硬件計數器的值與上一次讀取時(shí)硬件計數器的值的差值就是兩次讀取之間已經(jīng)過(guò)去的tick數。當實(shí)時(shí)時(shí)鐘產(chǎn)生中斷時(shí),即硬件計數器計到0,將此變量清零。
 
這樣,就可以保證每次讀取系統tick 時(shí),能得到一個(gè)準確的系統tick值。當有任務(wù)要主動(dòng)延時(shí)一段時(shí)間,即調用系統delay API時(shí)。ECOS的API函數會(huì )計算出該任務(wù)的delay時(shí)間點(diǎn),然后將該任務(wù)掛入系統delay隊列。然后遍歷系統delay隊列,找出隊列中的最小delay時(shí)間點(diǎn),把該delay時(shí)間點(diǎn)對應的delay時(shí)間寫(xiě)入GPT,讓GPT來(lái)控制delay時(shí)間。delay時(shí)間到后,GPT會(huì )產(chǎn)生中斷,ECOS將中斷處理程序分為兩部分,ISR和DSR。在ISR中將硬件計數器設為最大值。然后在DSR中增加系統tick,將超時(shí)的任務(wù)重新掛入就緒隊列,并且再次找出系統delay隊列上的最小delay時(shí)間點(diǎn),寫(xiě)入硬件計數器。如果系統delay隊列為空,則不對硬件計數器再進(jìn)行操作,保持ISR 中寫(xiě)入的最大值。最后ECOS會(huì )運行調度器,如果超時(shí)的任務(wù)具有最高優(yōu)先級,那么它就會(huì )得到運行,也就是醒過(guò)來(lái)。這樣也就可以保證系統delay的準確性與及時(shí)性。下圖是修改后實(shí)時(shí)時(shí)鐘后系統tick, delay以及調度器相關(guān)的流程圖。
 
下圖是修改后實(shí)時(shí)時(shí)鐘后系統tick, delay以及調度器相關(guān)的流程圖。
實(shí)時(shí)時(shí)鐘修改流程圖
圖1. 實(shí)時(shí)時(shí)鐘修改流程圖
 
下面是在飛思卡爾公司i.mx51上的實(shí)驗數據。
可以看出,修改了時(shí)間片調度和實(shí)時(shí)時(shí)鐘后,不論ARM工作在哪個(gè)電壓點(diǎn),系統IDLE時(shí)的功耗降低了差不多10倍。因此,延長(cháng)實(shí)時(shí)時(shí)鐘中斷間隔能極大的降低系統功耗。
 
4.其他系統的類(lèi)似方法
 
當前流行的嵌入式操作系統Linux和WinCE也都在討論修改系統實(shí)時(shí)時(shí)鐘中斷方式以求降低系統功耗。對于Linux系統,有一個(gè)Less Watts項目,實(shí)現tickless idle,即無(wú)tick的idle,其實(shí)就是修改實(shí)時(shí)時(shí)鐘的中斷方式。WinCE則提供了可變系統時(shí)鐘節拍Variable Tick Scheduler,在進(jìn)入idle狀態(tài)前改變系統時(shí)鐘節拍,這樣在預期的時(shí)間段里,idle狀態(tài)不會(huì )被無(wú)謂的系統時(shí)鐘中斷喚醒。
 
5.結論
 
可以看出,通過(guò)修改實(shí)時(shí)時(shí)鐘中斷方式,可以使CPU在idle狀態(tài)下長(cháng)時(shí)間處于低功耗模式,極大的降低系統功耗。而且當前流行的嵌入式操作系統都在積極的探討此方法。相信今后這項功能會(huì )成為嵌入式操作系統必備的一個(gè)功能。
 
特別推薦
技術(shù)文章更多>>
技術(shù)白皮書(shū)下載更多>>
熱門(mén)搜索
?

關(guān)閉

?

關(guān)閉

久久无码人妻精品一区二区三区_精品少妇人妻av无码中文字幕_98精品国产高清在线看入口_92精品国产自产在线观看481页
<s id="eoqoe"><xmp id="eoqoe">
<button id="eoqoe"><strong id="eoqoe"></strong></button>
<s id="eoqoe"><xmp id="eoqoe">
<button id="eoqoe"><strong id="eoqoe"></strong></button>
<wbr id="eoqoe"></wbr>
<wbr id="eoqoe"><strong id="eoqoe"></strong></wbr>
<wbr id="eoqoe"><strong id="eoqoe"></strong></wbr>
<wbr id="eoqoe"><strong id="eoqoe"></strong></wbr>
<wbr id="eoqoe"><label id="eoqoe"></label></wbr>
<button id="eoqoe"></button>
<wbr id="eoqoe"></wbr>