一種利用實時時鐘降低嵌入式系統功耗的方法
在ECOS系統的實時時鐘類中增加一個變量pre_hardware_count用于記錄上一次讀取的硬件計數器的值。當每次系統API讀取tick時,當前硬件計數器的值與上一次讀取時硬件計數器的值的差值就是兩次讀取之間已經過去的tick數。當實時時鐘產生中斷時,即硬件計數器計到0,將此變量清零。這樣,就可以保證每次讀取系統tick 時,能得到一個準確的系統tick值。當有任務要主動延時一段時間,即調用系統delay API時。
ECOS的API函數會計算出該任務的delay時間點,然后將該任務掛入系統delay隊列。然后遍歷系統delay隊列,找出隊列中的最小delay時間點,把該delay時間點對應的delay時間寫入GPT,讓GPT來控制delay時間。delay時間到后,GPT會產生中斷,ECOS將中斷處理程序分為兩部分,ISR和DSR。在ISR中將硬件計數器設為最大值。然后在DSR中增加系統tick,將超時的任務重新掛入就緒隊列,并且再次找出系統delay隊列上的最小delay時間點,寫入硬件計數器。
如果系統delay隊列為空,則不對硬件計數器再進行操作,保持ISR 中寫入的最大值。最后ECOS會運行調度器,如果超時的任務具有最高優先級,那么它就會得到運行,也就是醒過來。這樣也就可以保證系統delay的準確性與及時性。下圖是修改后實時時鐘后系統tick, delay以及調度器相關的流程圖。
下圖是修改后實時時鐘后系統tick, delay以及調度器相關的流程圖。

圖1. 實時時鐘修改流程圖
下面是在飛思卡爾公司i.mx51上的實驗數據。

可以看出,修改了時間片調度和實時時鐘后,不論ARM工作在哪個電壓點,系統IDLE時的功耗降低了差不多10倍。因此,延長實時時鐘中斷間隔能極大的降低系統功耗。
4.其他系統的類似方法
當前流行的嵌入式操作系統Linux和WinCE也都在討論修改系統實時時鐘中斷方式以求降低系統功耗。對于Linux系統,有一個Less Watts項目,實現tickless idle,即無tick的idle,其實就是修改實時時鐘的中斷方式。WinCE則提供了可變系統時鐘節拍Variable Tick Scheduler,在進入idle狀態前改變系統時鐘節拍,這樣在預期的時間段里,idle狀態不會被無謂的系統時鐘中斷喚醒。
5.結論
可以看出,通過修改實時時鐘中斷方式,可以使CPU在idle狀態下長時間處于低功耗模式,極大的降低系統功耗。而且當前流行的嵌入式操作系統都在積極的探討此方法。相信今后這項功能會成為嵌入式操作系統必備的一個功能。
評論