Tickless 具體實(shí)現(xiàn)
1、宏 configUSE_TICKLESS_IDLE
要想使用 Tickless 模式,首先必須將 FreeRTOSConfig.h 中的宏 configUSE_TICKLESS_IDLE設(shè)置為 1,代碼如下:
#define configUSE_TICKLESS_IDLE 1 //1 啟用低功耗 tickless 模式
2、宏 portSUPPRESS_TICKS_AND_SLEEP()
使能 Tickless 模式以后當(dāng)下面兩種情況都出現(xiàn)的時(shí)候 FreeRTOS 內(nèi)核就會(huì)調(diào)用宏portSUPPRESS_TICKS_AND_SLEEP()來(lái)處理低功耗相關(guān)的工作。
● 空閑任務(wù)是唯一可運(yùn)行的任務(wù),因?yàn)槠渌械娜蝿?wù)都處于阻塞態(tài)或者掛起態(tài)。
● 系統(tǒng)處于低功耗模式的時(shí)間至少大于 configEXPECTED_IDLE_TIME_BEFORE_SLEEP個(gè)時(shí)鐘節(jié)拍,宏 configEXPECTED_IDLE_TIME_BEFORE_SLEEP 默認(rèn)在文件 FreeRTOS.h 中定義為 2,我們可以在 FreeRTOSConfig.h 中重新定義,此宏必須大于 2!
portSUPPRESS_TICKS_AND_SLEEP()有個(gè)參數(shù),此參數(shù)用來(lái)指定還有多長(zhǎng)時(shí)間將有任務(wù)進(jìn)入就緒態(tài),其實(shí)就是處理器進(jìn)入低功耗模式的時(shí)長(zhǎng)(單位為時(shí)鐘節(jié)拍數(shù)),因?yàn)橐坏┯衅渌蝿?wù) 進(jìn) 入 就 緒 態(tài) 處 理 器 就 必 須 退 出 低 功 耗 模 式 去 處 理 這 個(gè) 任 務(wù) 。portSUPPRESS_TICKS_AND_SLEEP()應(yīng)該是由用戶根據(jù)自己所選擇的平臺(tái)來(lái)編寫(xiě)的,此宏會(huì)被空閑任務(wù)調(diào)用來(lái)完成具體的低功耗工作。但是!如果使用 STM32 的話編寫(xiě)這個(gè)宏的工作就不用我們來(lái)完成了,因?yàn)?FreeRTOS 已經(jīng)幫我們做好了,有沒(méi)有瞬間覺(jué)得好幸福啊。當(dāng)然了你也可以自己去重新編寫(xiě),不使用 FreeRTOS 提供的 ,如果自己編寫(xiě)的話需要先將configUSE_TICKLESS_IDLE 設(shè)置為 2。宏 portSUPPRESS_TICKS_AND_SLEEP 在文件 portmacro.h 中定義。
3、宏 configPRE_SLEEP_PROCESSING ()和 configPOST_SLEEP_PROCESSING()
在真正的低功耗設(shè)計(jì)中不僅僅是將處理器設(shè)置到低功耗模式就行了,還需要做一些其他的處理,比如:
● 將處理器降低到合適的頻率,因?yàn)轭l率越低功耗越小,甚至可以在進(jìn)入低功耗模式以后關(guān)閉系統(tǒng)時(shí)鐘。
● 修改時(shí)鐘源,晶振的功耗肯定比處理器內(nèi)部的時(shí)鐘源高,進(jìn)入低功耗模式以后可以切換到內(nèi)部時(shí)鐘源,比如 STM32 的內(nèi)部 RC 振蕩器。
● 關(guān)閉其他外設(shè)時(shí)鐘,比如 IO 口的時(shí)鐘。
● 關(guān)閉板子上其他功能模塊電源,這個(gè)需要在產(chǎn)品硬件設(shè)計(jì)的時(shí)候就要處理好,比如可以通過(guò) MOS 管來(lái)控制某個(gè)模塊電源的開(kāi)關(guān),在處理器進(jìn)入低功耗模式之前關(guān)閉這些模塊的電源。
有關(guān)產(chǎn)品低功耗設(shè)計(jì)的方法還有很多,大家可以上網(wǎng)查找一下,上面列舉出的這幾點(diǎn)在處理器進(jìn)入低功耗模式之前就要完成處理。FreeRTOS 為我們提供了一個(gè)宏來(lái)完成這些操作,它就是 configPRE_SLEEP_PROCESSING(),這個(gè)宏的具體實(shí)現(xiàn)內(nèi)容需要用戶去編寫(xiě)。如果在進(jìn)入低功耗模式之前我們降低了處理器頻率、關(guān)閉了某些外設(shè)時(shí)鐘等的話,那在退出低功耗模式以后就 需 要 恢 復(fù) 處 理 器 頻 率 、 重 新 打 開(kāi) 外 設(shè) 時(shí) 鐘 等 , 這 個(gè) 操 作 在 宏configPOST_SLEEP_PROCESSING()中完成,同樣的這個(gè)宏的具體內(nèi)容也需要用戶去編寫(xiě)。這兩個(gè)宏會(huì)被函數(shù) vPortSuppressTicksAndSleep()調(diào)用,我們可以在 FreeRTOSConfig.h 定義這兩個(gè)宏,如下:
/********************************************************************************/
/* FreeRTOS 與低功耗管理相關(guān)配置 */
/********************************************************************************/
extern void PreSleepProcessing(uint32_t ulExpectedIdleTime);
extern void PostSleepProcessing(uint32_t ulExpectedIdleTime);
//進(jìn)入低功耗模式前要做的處理
#define configPRE_SLEEP_PROCESSING PreSleepProcessing
//退出低功耗模式后要做的處理
#define configPOST_SLEEP_PROCESSING PostSleepProcessing
函數(shù) PreSleepProcessing()和 PostSleepProcessing()可以在任意一個(gè) C 文件中編寫(xiě),本章對(duì)應(yīng)的例程是在 main.c 文件中,函數(shù)的具體內(nèi)容在下一節(jié)詳解。
4、宏 configEXPECTED_IDLE_TIME_BEFORE_SLEEP
處理器工作在低功耗模式的時(shí)間雖說(shuō)沒(méi)有任何限制,1 個(gè)時(shí)鐘節(jié)拍也行,滴答定時(shí)器所能計(jì)時(shí)的最大值也行。但是時(shí)間太短的話意義也不大啊,就 1 個(gè)時(shí)鐘節(jié)拍,我這剛進(jìn)去就得出來(lái)!所 以 我 們 必 須 對(duì) 工 作 在 低 功 耗 模 式 的 時(shí) 間 做 個(gè) 限 制 , 不 能 太 短 了 , configEXPECTED_IDLE_TIME_BEFORE_SLEEP 就是用來(lái)完成這個(gè)功能的。此宏默認(rèn)在文件FreeRTOS 中有定義,如下:
#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2
#endif
#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2
#error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2
#endif
默認(rèn)情況下 configEXPECTED_IDLE_TIME_BEFORE_SLEEP 為 2 個(gè)時(shí)鐘節(jié)拍,并且最小不能小于 2 個(gè)時(shí)鐘節(jié)拍。如果要修改這個(gè)值的話可以在文件 FreeRTOSConfi.h 中對(duì)其重新定義。此宏會(huì)在空閑任務(wù)函數(shù) prvIdleTask()中使用!
到此為止,F(xiàn)reeRTOS 中低功耗的基礎(chǔ)大家都已經(jīng)掌握了,可以在自己已經(jīng)有的代碼中加入此機(jī)制,看看功耗是否有降低。使能上面第一個(gè)宏定義,然后實(shí)現(xiàn)其他三個(gè)宏定義即可將低功耗機(jī)制加入自己的項(xiàng)目中。
-
嵌入式
+關(guān)注
關(guān)注
5046文章
18817瀏覽量
298548 -
內(nèi)核
+關(guān)注
關(guān)注
3文章
1336瀏覽量
40084 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61724
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論