FreeRTOS 任務管理

2022-06-30 22:27:11 字數 3017 閱讀 5832

1. freertos 任務不允許以任何方式從實現函式中返回——他們絕不能有一條「return」語句,也不可能執行到函式的末尾。如果乙個函式不需要,可以將其刪除,如在任務中使用函式vtaskdelete(null),將當前任務刪除。

2. 在啟動任務排程器(oskernelstart() )

前,最好只建立乙個起始任務

,在啟動任務排程器(oskernelstart() )後,在起始任務中建立其他的任務,此時建議關閉中斷。如 taskenter_critical() ,...《建立任務》... taskexit_critical() 。

3. 優先順序數目的最大值,為 freertosconfig.h 中 configmax_priorities 的值。freertos本身並沒有限定這個最大值,但是這個值越大,核心花銷的記憶體就越大。故建議盡量將此常量設到可接受的最小值。

4. 在 《freertos v8.2.1》 中定義任務優先順序的有效範圍是從-3到 configmax_priorities-3-1 。需要注意的是 ① 多個任務可以共用乙個優先順序;② 優先順序號越小的任務優先順序越低,如優先順序號-3表示優先順序最低。注,arm的優先順序號越小則優先順序越高。

5. freertos在進行任務排程時,若多個優先順序相同且最高的任務均進入就緒狀態,則排程器會讓這些任務輪流執行,即時間片輪轉排程。

6.阻塞狀態:如果乙個任務正在等待某個事件發生,則稱這個任務處於「阻塞態(blocked)」。任務可以進入阻塞態以等待兩種不同型別的事件:

1)定時(時間相關)時間——這類事件可以是延遲到期或是絕對時間到。比如某個任務可以進入阻塞態以延遲10ms。

2)同步時間——源於其他任務或中斷事件。例如,某個任務進入阻塞態以等待佇列中有資料到來。同步時間囊括了所有板級範圍的事件型別。

7.掛起狀態:處於掛起狀態的任務對排程器而言是不可見的。當然,大多數應用程式都不會掛起某個任務。

1)掛起任務:唯一方法就是呼叫 vtasksuspend() api 函式。

2)恢復任務:唯一方法就是呼叫 vtaskresume() 或

vtaskresumefromisr() api 函式。

8. 完整任務狀態機如下圖所示。

9. 系統在啟動任務排程器時,自動建立空閒任務(優先順序最低),以保證系統在任一時刻,至少有乙個任務可執行。

10. 空閒任務的鉤子函式(或稱回掉函式,hook,or call-back),使用者可以直接在空閒任務的鉤子函式中新增應用程式的相關功能。空閒任務每執行一次就會呼叫一次鉤子函式。若使用空閒任務鉤子函式,則在freertosconfig.h 中 configuse_idle_hook 必須定義為1。

1)空閒任務鉤子函式的作用:

a)執行低優先順序,後台或需要不停處理的功能**。

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

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

2)空閒任務鉤子函式的實現限制

a)絕對不能夠阻塞或掛起。空閒任務只有在其他任務不執行時才會被執行(除非有應用任務共享空閒任務優先順序)。以任何方式阻塞空閒任務都可能導致沒有任務進入執行態。

b)如果應用程式用到了 vtaskdelete()ap 函式,則空閒任務的鉤子函式必須盡快返回,因為在任務被刪除後,空閒任務負責**核心資源。如果空閒任務一直處於鉤子函式中,則無法進行收回。

11. 在建立任務時定義了任務的優先順序,啟動排程器後,可以使用 vtaskpriofityset() 改變任何任務的優先順序。

12. 任務可以使用 vtaskdelete() api 刪除自己或其他任務。任務被刪除後就不復存在,也不會進入執行態。任務一旦被刪除,空閒任務就會將已刪除的任務的記憶體釋放掉,因此,千萬不能把空閒任務的執行時間餓死。說明:只有核心為任務分配的記憶體空間才會在任務被刪除後自動收回,任務自己占用的記憶體或資源需要由引用程式自己顯示地釋放。

13. freertos的常用的任務排程方案被稱為「固定優先順序搶占式排程」。

固定優先順序」是指每乙個任務都賦予乙個優先順序,這個優先順序不能被核心本身改變,只能被任務修改。

搶占式」是指當任務進入就緒態或優先順序改變時,若處於執行態的優先順序更低,則該任務總是搶占當前執行的任務。

freertos還可以採用協作式排程。

採用乙個純粹的協作式排程器,只可能在執行態任務進入阻塞態或是執行態任務顯示呼叫 taskyield() 時,才會進行上下文切換。任務永遠不會被搶占,而具有相同優先順序的任務也不會自動共享處理器時間。協作排程的這種工作方式雖然比較簡單,但可能導致系統響應不夠快。

freertos還可以採用混合排程方案,這時需要在中斷服務例程中顯示地進行上下文切換,從而允許同步事件產生搶占式行為,但時間時間卻不行。這樣做的結果是得到乙個沒有時間片機制的搶占式系統。這也是一種常見的排程器配置。

14. 如何設定任務優先順序?

作為一種通用的規則,完成硬實時功能的任務優先順序高於完成軟實時任務的優先順序。但其他一些因素,比如執行時間和處理器的利用率,也要納入考慮範圍之內,以保證應用程式不會超過硬實時的需求限制。

15.單步速率排程(rate monotonic scheduling,rms:是一種常用的優先順序分配技術。其根據任務週期性執行的速率來分配乙個唯一的優先順序。具有最高週期執行頻率的任務被賦予最高的優先順序;具有最低執行頻率的任務被賦予最低優先順序。

這種優先順序分配方式被證明了可以最大化整個應用程式的可排程性(schedulability),但是執行時間不定及並非所有任務都具有週期性,會使得對這種方式的全面計算變得複雜。

16. 任務的堆疊大小:棧深度 x 棧寬度

注:棧大小不能超過size_t 型別變數所能表達的最大值。

例. 32位寬的棧空間,若棧深度為100,則棧大小為 100 x 4 = 400 (byte)

FreeRTOS任務切換

任務切換一共兩種方式 系統節拍器中斷 呼叫portyield。但是,最終都是產生pendsv中斷。systick異常處理入口 void xportsystickhandler void 開啟中斷 vportclearbaseprifromisr 請求排程 define portyield 系統節拍器...

FreeRTOS空閒任務

空閒任務在啟動排程器的時候被建立 啟動排程器 void vtaskstartscheduler void else endif if xreturn pdpass else else 空閒任務的作用包括 保證系統至少有乙個任務在執行 檢查等待終結列表中是否有任務並釋放它們。空閒任務 static p...

第二章 FreeRTOS任務管理

區別 vtaskdelay掛起時間是相對於任務呼叫vtaskdelay的那一刻開始計算,vtaskdelayuntil 實現某個任 務 以 固 定 頻 率 周 期 性 執 行 void vtaskdelay portticktype xtickstodelay xtickstodelay 延遲多少個...