FreeRTOS 低功耗之 tickless 模式

2021-08-19 21:16:51 字數 1791 閱讀 4334

反映在 freertos 上,tickless 又是怎樣一種情況呢?我們都知道,當使用者任務都被掛起或者阻塞時,最低優先順序的空閒任務會得到執行。 那麼 stm32 支援的睡眠模式,停機模式就可以放在空閒任務裡面實現。但是,為了實現低功耗最優設計,我們還不能直接把睡眠或者停機模式直接放在空閒任務裡。 

進入空閒任務後,首先要計算可以執行低功耗的最大時間,也就是求出下乙個要執行的高優先順序任務還剩多少時間。 然後就是把低功耗的喚醒時間設定為這個求出的時間,到時間後系統會從低功耗模式被喚醒,繼續執行多工。這個就是所謂的 tickless 模式。

在空閒任務鉤子函式中設定微處理器進入低功耗模式來達到省電的目的。因為系統要響應系統節拍中斷事件,因此使用這種方法會週期性的退出、再進入低功耗狀態。如果系統節拍中斷頻率過快,則大部分電能和cpu時間會消耗在進入和退出低功耗狀態上。

根據使用者配置configexpected_idle_time_before_sleep的大小,只有當系統可執行於低功耗模式的時鐘節拍數大於等於這個引數時,系統才可以進入到低功耗模式。 此引數預設已經在freertos.h檔案進行定義了,下面是具體的定義內容(當然,使用者也可以在 freertosconfig.h 檔案中重新定義): 

預設定義的大小是 2 個系統時鐘節拍,且使用者自定義的話,不可以小於 2 個系統時鐘節拍。 

函式portsuppress_ticks_and_sleep();是 freertos 實現 tickless模式的關鍵,此函式被空閒任務呼叫,其定義是在 portmacro.h 檔案中: 

系統時鐘節拍不使用滴答定時器。這種情況我們這裡不做討論,使用者看 freertos 官網此處的說明即可:

configpre_sleep_processing( xexpectedidletime );

configpost_sleep_processing( xexpectedidletime );

執行低功耗模式前,使用者可以在這個函式裡面關閉外設時鐘來進一步降低系統功耗。 設定其它低功耗方式也是在這個函式裡面,使用者只需設定引數 xexpectedidletime=0 即可遮蔽掉預設的 wfi 指令執行方式,因為退出這個函式後會通過 if 語句檢測此引數是否大於 0,即上面的**所示。 因此,如果用 戶 想 實 現 其 它 低 功 耗 模 式 還 是 比 較 方 便 的 , 配 置 好 其 它 低 功 耗 模 式 後 , 設 置 參 數xexpectedidletime = 0 即可,但切不可將此引數隨意設定為 0 以外的其它數值。

configpost_sleep_processing ( xexpectedidletime )

退出低功耗模式後,此函式會得到呼叫,之前在configpre_sleep_processing裡面關閉的外設時鐘,可以在此函式裡面重新開啟,讓系統恢復到正常執行狀態。

顯然使用者自己配置要麻煩得多,好在freertos為m3,m4核心的做好了低功耗之睡眠模式,使得我們使用stm32 f1,f4系列的時候可以很簡單,只需要在配置檔案freertosconfig.h中加上乙個巨集定義:#define configuse_tickless_idle 1

出處:

FreeRTOS 低功耗之待機模式

stm32f103 如何進入待機模式 在 freertos 系統中,讓 stm32 進入待機模式比較容易,呼叫韌體庫函式pwr enterstandbymode 即可。stm32f103 如何退出待機模式 讓 stm32 從待機模式喚醒可以通過外部復位 nrst 引腳 iwdg 復位 wkup 引腳...

FreeRTOS 低功耗之停機模式

以下 自安富萊電子 stm32f103 如何進入停機模式 在 freertos 系統中,讓 stm32 進入停機模式比較容易,呼叫韌體庫函式 pwr enterstopmode 即可,不過要注意 為了進入停機模式,所有的外部中斷的請求位 掛起暫存器 exti pr 和 rtc 的鬧鐘 標誌都必須被清...

低功耗之產品功耗計算

1.產品功耗的計算概念 2.舉個例子 以某個產品為例,正常工作的平均電流為2ma,要求定位或者上傳資料時為100ma,定位資料半小時上傳一次,產品使用400ma電池。計算過程 半小時上傳一次,一天上傳48次,每次定位時間 假定為1分鐘 則公式為 48 次 1 分鐘 48分鐘 共消耗電流 48 分鐘 ...