1、如何降低功耗?
一般的簡單應用中處理器大量的時間都在處理空閑任務,所以我們就可以考慮當處理器處理空閑任務的時候就進入低功耗模式,當需要處理應用層代碼的時候就將處理器從低功耗模式喚醒。FreeRTOS 就是通過在處理器處理空閑任務的時候將處理器設置為低功耗模式來降低能耗。一般會在空閑任務的鉤子函數(shù)中執(zhí)行低功耗相關處理,比如設置處理器進入低功耗模式、關閉其他外設時鐘、降低系統(tǒng)主頻等等。
我們知道 FreeRTOS 的系統(tǒng)時鐘是由滴答定時器中斷來提供的,系統(tǒng)時鐘頻率越高,那么滴答定時器中斷頻率也就越高。以前講過,中斷是可以將 STM32F103 從睡眠模式中喚醒,周期性的滴答定時器中斷就會導致 STM32F103 周期性的進入和退出睡眠模式。因此,如果滴答定時器中斷頻率太高的話會導致大量的能量和時間消耗在進出睡眠模式中,這樣導致的結果就是低功耗模式的作用被大大的削弱。
為此,F(xiàn)reeRTOS 特地提供了一個解決方法——Tickless 模式,當處理器進入空閑任務周期以后就關閉系統(tǒng)節(jié)拍中斷(滴答定時器中斷),只有當其他中斷發(fā)生或者其他任務需要處理的時候處理器才會被從低功耗模式中喚醒。為此我們將面臨兩個問題:
問題一:關閉系統(tǒng)節(jié)拍中斷會導致系統(tǒng)節(jié)拍計數(shù)器停止,系統(tǒng)時鐘就會停止。
FreeRTOS 的系統(tǒng)時鐘是依賴于系統(tǒng)節(jié)拍中斷(滴答定時器中斷)的,如果關閉了系統(tǒng)節(jié)拍中斷的話就會導致系統(tǒng)時鐘停止運行,這是絕對不允許的!該如何解決這個問題呢?我們可以記錄下系統(tǒng)節(jié)拍中斷的關閉時間,當系統(tǒng)節(jié)拍中斷再次開啟運行的時候補上這段時間就行了。這時候我們就需要另外一個定時器來記錄這段該補上的時間,如果使用專用的低功耗處理器的話基本上都會有一個低功耗定時器,比如 STM32L4 系列(L 系列是 ST 的低功耗處理器)就有一個叫做 LPTIM(低功耗定時器)的定時器。STM32F103 沒有這種定時器那么就接著使用滴答定時器來完成這個功能,具體實現(xiàn)方法后面會講解。
問題二:如何保證下一個要運行的任務能被準確的喚醒?
即使處理器進入了低功耗模式,但是我的中斷和應用層任務也要保證及時的響應和處理。中斷自然不用說,本身就可以將處理器從低功耗模式中喚醒。但是應用層任務就不行了,它無法將處理器從低功耗模式喚醒,無法喚醒就無法運行!這個問題看來很棘手,既然應用層任務無法將處理器從低功耗模式喚醒,那么我們就借助其他的力量來完成這個功能。如果處理器在進入低功耗模式之前能夠獲取到還有多長時間運行下一個任務那么問題就迎刃而解了,我們只需要開一個定時器,定時器的定時周期設置為這個時間值就行了,定時時間到了以后產(chǎn)生定時中斷,處理器不就從低功耗模式喚醒了。這里似乎又引出了一個新的問題,那就是如何知道還有多長時間執(zhí)行下一個任務?這個時間也就是低功耗模式的執(zhí)行時間,值得慶辛的是 FreeRTOS已經(jīng)幫我們完成了這個工作。
-
處理器
+關注
關注
68文章
19100瀏覽量
228813 -
嵌入式
+關注
關注
5059文章
18973瀏覽量
302010 -
FreeRTOS
+關注
關注
12文章
483瀏覽量
61915
發(fā)布評論請先 登錄
相關推薦
評論