(一)任務狀態
freertos 中的任務永遠處於下面幾個狀態中的某乙個:
● 執行態
當乙個任務正在執行時,那麼就說這個任務處於執行態,處於執行態的任務就是當前正在
使用處理器的任務。如果使用的是單核處理器的話那麼不管在任何時刻永遠都只有乙個任務處
於執行態。
● 就緒態
處於就緒態的任務是那些已經準備就緒(這些任務沒有被阻塞或者掛起),可以執行的任務,
但是處於就緒態的任務還沒有執行,因為有乙個同優先順序或者更高優先順序的任務正在執行!
● 阻塞態
如果乙個任務當前正在等待某個外部事件的話就說它處於阻塞態,比如說如果某個任務調
用了函式 vtaskdelay()的話就會進入阻塞態,直到延時週期完成。任務在等待佇列、訊號量、事
件組、通知或互斥訊號量的時候也會進入阻塞態。任務進入阻塞態會有乙個超時時間,當超過
這個超時時間任務就會退出阻塞態,即使所等待的事件還沒有來臨!
● 掛起態
像阻塞態一樣,任務進入掛起態以後也不能被排程器呼叫進入執行態,但是進入掛起態的
任務沒有超時時間。任務進入和退出掛起態通過呼叫函式 vtasksuspend()和 xtaskresume()。
(二)任務優先順序
如果所使用的硬體平台支援類似計算前導零這樣的指令(可以通過該指令選 擇 下 一 個 要 運 行 的 任 務 , cortex-m 處 理 器 是 支 持 該 指 令 的 ) , 並 且 巨集
configuse_port_optimised_task_selection也 設 置 為 了 1, 那 麼 巨集configmax_priorities不能超過 32!也就是優先順序不能超過 32 級。
優先順序數字越低表示任務的優先順序越低,0 的優先順序最低,configmax_priorities-1 的優先順序最高。空閒任務的優先順序最低,為 0。
(三)任務控制塊
freertos 的每個任務都有一些屬性需要儲存,freertos 把這些屬性集合到一起用乙個結構體來表示,這個結構體叫做任務控制塊:tcb_t,在使用函式 xtaskcreate()建立任務的時候就會自動的給每個任務分配乙個任務控制塊。在老版本的 freertos 中任務控制塊叫做 tsktcb,新版本重新命名為 tcb_t,但是本質上還是 tsktcb
(四)任務堆疊
freertos 之所以能正確的恢復乙個任務的執行就是因為有任務堆疊在保駕護航,任務排程器在進行任務切換的時候會將當前任務的現場(cpu 暫存器值等)儲存在此任務的任務堆疊中,等到此任務下次執行的時候就會先用堆疊中儲存的值來恢復現場,恢復現場以後任務就會接著從上次中斷的地方開始執行。建立任務的時候需要給任務指定堆疊,如果使用的函式 xtaskcreate()建立任務(動態方法)的話那麼任務堆疊就會由函式 xtaskcreate()自動建立,後面分析 xtaskcreate()的時候會講解。如果使用函式 xtaskcreatestatic()建立任務(靜態方法)的話就需要程式設計師自行定義任務堆疊,然後堆疊首位址作為函式的引數 puxstackbuffer 傳遞給函式
FreeRTOS任務切換
任務切換一共兩種方式 系統節拍器中斷 呼叫portyield。但是,最終都是產生pendsv中斷。systick異常處理入口 void xportsystickhandler void 開啟中斷 vportclearbaseprifromisr 請求排程 define portyield 系統節拍器...
FreeRTOS空閒任務
空閒任務在啟動排程器的時候被建立 啟動排程器 void vtaskstartscheduler void else endif if xreturn pdpass else else 空閒任務的作用包括 保證系統至少有乙個任務在執行 檢查等待終結列表中是否有任務並釋放它們。空閒任務 static p...
FreeRTOS 任務管理
1.freertos 任務不允許以任何方式從實現函式中返回 他們絕不能有一條 return 語句,也不可能執行到函式的末尾。如果乙個函式不需要,可以將其刪除,如在任務中使用函式vtaskdelete null 將當前任務刪除。2.在啟動任務排程器 oskernelstart 前,最好只建立乙個起始任...