FreeRTOS——空閑任務與鈎子函數


當創建的任務大部分時間都處於阻塞態。這種狀態下所有的任務都不可運行,所以也不能被調度器選中。

  但處理器總是需要代碼來執行——所以至少要有一個任務處於運行態。為了保證這一點,當調用 vTaskStartScheduler()時,調度器會自動創建一個空閑任務。空閑任務是一個非常短小的循環——和最早的示例任務十分相似,總是可以運行。

  空閑任務擁有最低優先級(優先級 0)以保證其不會妨礙具有更高優先級的應用任務進入運行態——當然,沒有任何限制說是不能把應用任務創建在與空閑任務相同的優先級上;如果需要的話,你一樣可以和空閑任務一起共享優先級。

  運行在最低優先級可以保證一旦有更高優先級的任務進入就緒態,空閑任務就會立即切出運行態。這一點可以在 圖 9 的 tn 時刻看出來,當任務 2 退出阻塞態時,空閑任務立即切換出來以讓任務 2 執行。任務 2 被看作是搶占(pre-empted)了空閑任務。搶占是自動發生的,也並不需要通知被搶占任務。

空閑任務鈎子函數

通過空閑任務鈎子函數(或稱回調,hook, or call-back),可以直接在空閑任務中添加應用程序相關的功能。空閑任務鈎子函數會被空閑任務每循環一次就自動調用一次。

通常空閑任務鈎子函數被用於:

 ~ 執行低優先級,后台或需要不停處理的功能代碼。

 ~ 測試出系統處理裕量(空閑任務只會在所有其它任務都不運行時才有機會執行,所以測量出空閑任務占用的處理時間就可以清楚的知道系統有多少富余的處理時間)。

 ~ 將處理器配置到低功耗模式——提供一種自動省電方法,使得在沒有任何應用功能需要處理的時候,系統自動進入省電模式。

空閑任務鈎子函數的實現限制

空閑任務鈎子函數必須遵從以下規則

1. 絕不能阻塞或掛起。空閑任務只會在其它任務都不運行時才會被執行(除非有應用任務共享空閑任務優先級)。以任何方式阻塞空閑任務都可能導致沒有任務能夠進入運行態!

2. 如果應用程序用到了 vTaskDelete() API 函數,則空閑鈎子函數必須能夠盡快返回。因為在任務被刪除后,空閑任務負責回收內核資源。如果空閑任務一直運行在鈎子函數中,則無法進行回收工作。

空閑任務鈎子函數函數原型:void vApplicationIdleHook( void );

定義一個空閑任務鈎子函數

調用了帶阻塞性質的 vTaskDelay() API 函數,會產生大量的空閑時間——在這期間空閑任務會得到執行,因為兩個應用任務均處於阻塞態。下面的例子將通過空閑鈎子函數來使用這些空間時間。

FreeRTOSConfig.h 中的配置常量 configUSE_IDLE_HOOK 必須定義為 1,這樣空閑任務鈎子函數才會被調用。對應用任務實現函數進行了少量的修改,用以打印輸出變量 ulIdleCycleCount 的值,如 程序清單 19 所示。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM