一種利用實時時鐘降低嵌入式系統(tǒng)功耗的方法
在ECOS系統(tǒng)的實時時鐘類中增加一個變量pre_hardware_count用于記錄上一次讀取的硬件計數(shù)器的值。當(dāng)每次系統(tǒng)API讀取tick時,當(dāng)前硬件計數(shù)器的值與上一次讀取時硬件計數(shù)器的值的差值就是兩次讀取之間已經(jīng)過去的tick數(shù)。當(dāng)實時時鐘產(chǎn)生中斷時,即硬件計數(shù)器計到0,將此變量清零。這樣,就可以保證每次讀取系統(tǒng)tick 時,能得到一個準(zhǔn)確的系統(tǒng)tick值。當(dāng)有任務(wù)要主動延時一段時間,即調(diào)用系統(tǒng)delay API時。
ECOS的API函數(shù)會計算出該任務(wù)的delay時間點,然后將該任務(wù)掛入系統(tǒng)delay隊列。然后遍歷系統(tǒng)delay隊列,找出隊列中的最小delay時間點,把該delay時間點對應(yīng)的delay時間寫入GPT,讓GPT來控制delay時間。delay時間到后,GPT會產(chǎn)生中斷,ECOS將中斷處理程序分為兩部分,ISR和DSR。在ISR中將硬件計數(shù)器設(shè)為最大值。然后在DSR中增加系統(tǒng)tick,將超時的任務(wù)重新掛入就緒隊列,并且再次找出系統(tǒng)delay隊列上的最小delay時間點,寫入硬件計數(shù)器。
如果系統(tǒng)delay隊列為空,則不對硬件計數(shù)器再進(jìn)行操作,保持ISR 中寫入的最大值。最后ECOS會運行調(diào)度器,如果超時的任務(wù)具有最高優(yōu)先級,那么它就會得到運行,也就是醒過來。這樣也就可以保證系統(tǒng)delay的準(zhǔn)確性與及時性。下圖是修改后實時時鐘后系統(tǒng)tick, delay以及調(diào)度器相關(guān)的流程圖。
下圖是修改后實時時鐘后系統(tǒng)tick, delay以及調(diào)度器相關(guān)的流程圖。
圖1. 實時時鐘修改流程圖
下面是在飛思卡爾公司i.mx51上的實驗數(shù)據(jù)。
可以看出,修改了時間片調(diào)度和實時時鐘后,不論ARM工作在哪個電壓點,系統(tǒng)IDLE時的功耗降低了差不多10倍。因此,延長實時時鐘中斷間隔能極大的降低系統(tǒng)功耗。
4.其他系統(tǒng)的類似方法
當(dāng)前流行的嵌入式操作系統(tǒng)Linux和WinCE也都在討論修改系統(tǒng)實時時鐘中斷方式以求降低系統(tǒng)功耗。對于Linux系統(tǒng),有一個Less Watts項目,實現(xiàn)tickless idle,即無tick的idle,其實就是修改實時時鐘的中斷方式。WinCE則提供了可變系統(tǒng)時鐘節(jié)拍Variable Tick Scheduler,在進(jìn)入idle狀態(tài)前改變系統(tǒng)時鐘節(jié)拍,這樣在預(yù)期的時間段里,idle狀態(tài)不會被無謂的系統(tǒng)時鐘中斷喚醒。
5.結(jié)論
可以看出,通過修改實時時鐘中斷方式,可以使CPU在idle狀態(tài)下長時間處于低功耗模式,極大的降低系統(tǒng)功耗。而且當(dāng)前流行的嵌入式操作系統(tǒng)都在積極的探討此方法。相信今后這項功能會成為嵌入式操作系統(tǒng)必備的一個功能。
評論