以下基礎知識**自正點原子pdf資料。
前面例子中建立的任務大部份時間都處於阻塞態。這種狀態下所有的任務都不可執行,
所以也不能被排程器選中。
但處理器總是需要**來執行——所以至少要有乙個任務處於執行態。為了保證這
一點,當呼叫 vtaskstartscheduler()時,排程器會自動建立乙個空閒任務。空閒任務是
乙個非常短小的迴圈——和最早的示例任務十分相似,總是可以執行。
空閒任務擁有最低優先順序(
優先順序
0)以保證其不會妨礙具有更高優先順序的應用任務
進入執行態——當然,沒有任何限制說是不能把應用任務建立在與空閒任務相同的優先
級上;如果需要的話,你一樣可以和空閒任務一起共享優先順序。
執行在最低優先順序可以保證一旦有更高優先順序的任務進入就緒態,空閒任務就會立即切出執行態。
空閒任務鉤子函式
通過空閒任務鉤子函式
(或稱**,
hook, or call-back)
,可以直接在空閒任務中添
加應用程式相關的功能。空閒任務鉤子函式會被空閒任務每迴圈一次就自動呼叫一次。
通常空閒任務鉤子函式被用於:
執行低優先順序,後台或需要不停處理的功能**。
測試出系統處理裕量(空閒任務只會在所有其它任務都不執行時才有機會執行,所
以測量出空閒任務占用的處理時間就可以清楚的知道系統有多少富餘的處理時
間)。
將處理器配置到低功耗模式——提供一種自動省電方法,使得在沒有任何應用功能
需要處理的時候,系統自動進入省電模式。
空閒任務鉤子函式的實現限制
空閒任務鉤子函式必須遵從以下規則
1. 絕不能阻塞或掛起。空閒任務只會在其它任務都不執行時才會被執行
(除非有應用任
務共享空閒任務優先順序
)。以任何方式阻塞空閒任務都可能導致沒有任務能夠進入
執行態!
2. 如果應用程式用到了
vtaskdelete() api
函式,則空閒鉤子函式必須能夠盡快返回。
因為在任務被刪除後,空閒任務負責**核心資源。如果空閒任務一直執行在鉤
子函式中,則無法進行**工作。
呼叫了帶阻塞性質的
vtaskdelay() api
函式,會產生大量的空閒時間——在
這期間空閒任務會得到執行,因為兩個應用任務均處於阻塞態。本例通過空閒鉤子函式
來使用這些空間時間。具體源**參見程式清單 18。
建立任務可以有靜態和動態之分,但是靜態建立需要開啟乙個巨集,並且需要自己提供堆疊,一般用陣列實現,這種方式一般不使用,我們通常使用動態建立的方式:
FreeRTOS空閒任務
空閒任務在啟動排程器的時候被建立 啟動排程器 void vtaskstartscheduler void else endif if xreturn pdpass else else 空閒任務的作用包括 保證系統至少有乙個任務在執行 檢查等待終結列表中是否有任務並釋放它們。空閒任務 static p...
FreeRTOS 空閒任務與阻塞延遲實現
在裸機執行中,我們是使用軟體延時來實現延時的功能 delay 即是讓cpu空等來達到延時的目的。使用rtos的很大優勢就是榨乾cpu效能,永遠不讓他閒著,任務需要延時也就不需要讓cpu空等來實現延時的效果。rtos中的延時叫做阻塞延時,即任務需要延時的時候,任務會放棄cpu的使用權,cpu可以去幹其...
freeRTOS 空閒任務與阻塞延時 1
rtos中的延時是在需要延時的時間內任務放棄cpu的使用權,超過延時時間後重新獲得cpu的使用權。叫做 阻塞延時。空閒任務是在啟動排程器後建立的,是cpu空閒時候執行的,是優先順序最低的。空閒任務主要做一些清理記憶體的的任務。空閒任務是不允許阻塞的。如何實現空閒任務?1.在main.c定義空閒任務棧...