以下基礎知識轉載自正點原子PDF資料。
前面例子 中創建的任務大部份時間都處於阻塞態。這種狀態下所有的任務都不可運行,
所以也不能被調度器選中。
但處理器總是需要代碼來執行——所以至少要有一個任務處於運行態。為了保證這
一點,當調用 vTaskStartScheduler()時,調度器會自動創建一個空閑任務。空閑任務是
一個非常短小的循環——和最早的示例任務十分相似,總是可以運行。
空閑任務擁有最低優先級(優先級 0)以保證其不會妨礙具有更高優先級的應用任務
進入運行態——當然,沒有任何限制說是不能把應用任務創建在與空閑任務相同的優先
級上;如果需要的話,你一樣可以和空閑任務一起共享優先級。
運行在最低優先級可以保證一旦有更高優先級的任務進入就緒態,空閑任務就會立即切出運行態。
空閑任務鈎子函數
通過空閑任務鈎子函數(或稱回調, hook, or call-back),可以直接在空閑任務中添
加應用程序相關的功能。空閑任務鈎子函數會被空閑任務每循環一次就自動調用一次。
通常空閑任務鈎子函數被用於:
執行低優先級,后台或需要不停處理的功能代碼。
測試出系統處理裕量(空閑任務只會在所有其它任務都不運行時才有機會執行,所
以測量出空閑任務占用的處理時間就可以清楚的知道系統有多少富余的處理時
間)。
將處理器配置到低功耗模式——提供一種自動省電方法,使得在沒有任何應用功能
需要處理的時候,系統自動進入省電模式。
空閑任務鈎子函數的實現限制
空閑任務鈎子函數必須遵從以下規則
1. 絕不能阻塞或掛起。空閑任務只會在其它任務都不運行時才會被執行(除非有應用任
務共享空閑任務優先級)。以任何方式阻塞空閑任務都可能導致沒有任務能夠進入
運行態!
2. 如果應用程序用到了 vTaskDelete() API 函數,則空閑鈎子函數必須能夠盡快返回。
因為在任務被刪除后,空閑任務負責回收內核資源。如果空閑任務一直運行在鈎
子函數中,則無法進行回收工作。
調用了帶阻塞性質的 vTaskDelay() API 函數,會產生大量的空閑時間——在
這期間空閑任務會得到執行,因為兩個應用任務均處於阻塞態。本例通過空閑鈎子函數
來使用這些空間時間。具體源代碼參見程序清單 18。
創建任務可以有靜態和動態之分,但是靜態創建需要開啟一個宏,並且需要自己提供堆棧,一般用數組實現,這種方式一般不使用,我們通常使用動態創建的方式: