任務排程的方式:
一.搶占式
如果使用者在 freertos 的配置檔案 freertosconfig.h 中禁止使用時間片排程, 那麼每個任務必須配置不同的優先順序。當 freertos 多工啟動執行後,基本會按照如下的方式去執行:
1.首先執行的最高優先順序的任務 task1, task1 會一直執行直到遇到系統阻塞式的 api 函式,比如延遲,事件標誌等待,訊號量等待,task1 任務會被掛起,也就是釋放 cpu 的執行權,讓低優先順序的任務得到執行。
2.freertos 作業系統繼續執行任務就緒列表中下乙個最高優先順序的任務 task2,task2 執行過程中有兩種情況:
(1) task1由於延遲時間到, 接收到訊號量訊息等方面的原因, 使得 task1從掛起狀態恢復到就緒態,在搶占式排程器的作用下,task2 的執行會被 task1 搶占。
(2)task2 會一直執行直到遇到系統阻塞式的 api 函式,比如延遲,事件標誌等待,訊號量等待, task2任務會被掛起,繼而執行就緒列表中下乙個最高優先順序的任務。
如果使用者建立了多個任務並且採用搶占式排程器的話,基本都是按照上面兩條來執行。 根據搶占式排程器,當前的任務要麼被高優先順序任務搶占,要麼通過呼叫阻塞式 api 來釋放 cpu 使用權讓低優先順序任務執行,沒有使用者任務執行時就執行空閒任務。
簡而言之,就是如果高優先順序任務一直處於ready狀態的話,那麼低優先順序的任務將會一直無法執行。
舉例說明:
執行條件:
*建立 3 個任務 task1,task2 和 task3。
*task1 的優先順序為 1,task2 的優先順序為 2,task3 的優先順序為 3。 freertos 作業系統是設定的數值越小任務優先順序越低,故 task3 的優先順序最高,task1 的優先順序最低。
執行過程描述如下: 此時任務 task1 在執行中,執行過程中由於 task2 就緒,在搶占式排程器的作用下任務 task2 搶占task1 的執行。 task2 進入到執行態,task1 由執行態進入到就緒態。
任務 task2 在執行中,執行過程中由於 task3 就緒,在搶占式排程器的作用下任務 task3 搶占 task2的執行。 task3 進入到執行態,task2 由執行態進入到就緒態。
任務 task3 執行過程中呼叫了阻塞式 api 函式,比如 vtaskdelay,任務 task3 被掛起,在搶占式排程器的作用下查詢到下乙個要執行的最高優先順序任務是 task2,任務 task2 由就緒態進入到執行態。
任務 task2 在執行中,執行過程中由於 task3 再次就緒,在搶占式排程器的作用下任務 task3 搶占task2 的執行。 task3 進入到執行態,task2 由執行態進入到就緒態。
上面就是乙個簡單的不同優先順序任務通過搶占式排程進行任務排程和任務切換的過程。
2.時間片輪轉
在 freertos 作業系統中只有同優先順序任務才會使用時間片排程,另外還需要使用者在freertosconfig.h 檔案中使能巨集定義: #define configuse_time_slicing 1
時間片輪轉,只針對同一優先順序的任務,這個理論上不需要你主動進入 block 狀態,因為時間片一到,就會被強制切換到下乙個就緒任務(同一優先順序)
執行條件:
這裡僅對時間片排程進行說明。
建立 4 個同優先順序任務 task1,task2,task3 和 task4。
每個任務分配的時間片大小是 5 個系統時鐘節拍。
執行過程描述如下:
先執行任務 task1,執行夠 5 個系統時鐘節拍後,通過時間片排程切換到任務 task2。
任務 task2 執行夠 5 個系統時鐘節拍後,通過時間片排程切換到任務 task3。
任務 task3 在執行期間呼叫了阻塞式 api 函式,呼叫函式時,雖然 5 個系統時鐘節拍的時間片大小
還沒有用完,此時依然會通過時間片排程切換到下乙個任務 task4。 (注意,沒有用完的時間片不會再使用,下次任務 task3 得到執行還是按照 5 個系統時鐘節拍執行)
任務 task4 執行夠 5 個系統時鐘節拍後,通過時間片排程切換到任務 task1。
上面就是乙個簡單的同優先順序任務通過時間片排程進行任務排程和任務切換的過程。
補充:時間片排程和搶占式排程我們一般都是開啟了的,這樣優先順序相同時,使用時間片排程,優先順序不同時,使用搶占式排程。
ucos的任務優先順序和freertos的任務優先順序不一樣:ucos:數值越小,優先順序越高
freertos:數值越小,優先順序越小
freertos作業系統 任務排程
一 任務建立 目的 應用程式中如何給各任務分配處理時間 任意時刻,os如何使任務投入執行 優先順序如何影響系統行為 任務狀態 如何實現任務 建立乙個或多個任務的例項 任務引數的使用 right 改變任務優先順序 刪除任務 週期性處理 空閒任務何時執行,可以用來幹什麼 解決 任務實現 任務函式 voi...
了解FreeRTOS作業系統
1 與freertos核心有關的檔案數量為3個,分別是list.c queue.c tasks.c 該檔案位於freertos source 2 與記憶體分配有關的檔案共有5個,分別是heap 1.c,heap 2.c,heap 3.c,heap 4.c,heap 5.c。5個檔案只需選擇其中的1個...
FreeRTOS 作業系統學習(二) 任務
freertos 作業系統學習 1.任務 1.1 freertos 中的任務 只要硬體和記憶體足夠,freertos 執行的任務數量不受限制,作為乙個實時作業系統,freertos 同時支援迴圈和非迴圈任務。在 rtos 中,任務由乙個簡單的c函式定義,引數為void 型別,無返回值 void 用些...