freertos學習之任務排程切換

2021-10-11 02:25:13 字數 1628 閱讀 9986

freertos 的任務具有如下幾種狀態:

執行running

就緒ready

阻塞blocked

掛起suspended

除了執行狀態之外的狀態統稱為非執行狀態。因為 freertos 是為單cpu設計的系統,在任何時刻最多只能允許乙個任務處在執行狀態,哪怕看起來好像有多個任務同時在執行——這只是多個任務不停地切換帶來的效果。當乙個任務從執行狀態切換到非執行狀態時,執行時的現場——cpu暫存器被儲存在任務的私有堆疊中;在重新回到執行狀態時,再從堆疊中恢復之間儲存的暫存器。這是任務排程的最基本功能。

freertos 任務的就緒狀態表示任務目前沒有被執行,但隨時可以被執行。當下一次任務切換時機到來時,freertos 將從就緒任務的列表中選擇優先順序最高的任務,切換成執行狀態。

任務優先順序是任務的乙個屬性,freertos 用整型數表示優先順序,最低優先順序為0, 最高為 configmax_priorities 巨集定義的值減去1. 建立任務的時候需要指定乙個優先順序,在建立之後也可以再通過 vtaskpriorityset() 函式更改。優先順序的意義是,某乙個任務處於就緒狀態時,只要還存在比它優先順序高的任務也處於就緒狀態,它就得不到執行的機會。

當有兩個以上相同優先順序的任務處於就緒狀態時,它們會輪流地得到機會執行(但不保證執行時間是平均分配的),系統不會偏向其中任乙個。

freertos 在以下情況下必然發生任務切換:

(1) 執行中的任務呼叫 vtasksuspend() 將自己掛起。

(2) 執行中的任務呼叫了延時函式,要求等待一段時間後再執行。

(3)執行中的任務需要等待乙個未發生的同步事件。

因為是當前任務主動暫停執行,freertos 需要將它切換到掛起或者阻塞狀態,然後從就緒狀態的任務列表中選擇最高優先順序的任務來執行。若已經沒有其它需要執行的任務了,還會執行系統自帶的,具有最低優先順序的 idle task. 還有乙個特殊的情況是

(4) 執行中的任務呼叫了 taskyield() 主動要求切換任務。

這時候如果就緒任務列表中有同一或更高優先順序的任務,將發生任務切換,否則會返回當前任務繼續執行。

如果 freertos 配置中有 configuse_preempiton=1, 則進行搶占式任務排程。搶占的意義是在任務就緒列表中新加入的任務(包括新建任務、從掛起狀態恢復的任務、從阻塞狀態退出的任務),以及被修改了優先順序的任務,具有比當前執行任務更高的優先順序時,立即切換到那個更高優先順序的任務執行。而先前執行的任務不知道自己的執行在何時被暫停,故稱為「被搶占」。

搶占式排程保證了最高優先順序的任務一旦執行條件成熟,就會立即得到處理器資源。不過如果最高優先順序的任務不止乙個時,預設它們是不會相互搶占的,除非再配置了 configuse_time_slicing=1, 由 freertos 進行時間片管理。啟用時間片管理之後,相同優先順序的就緒任務輪流執行,每個任務每次最多執行乙個固定的週期,基本上讓處理器資源平均分配。  

小結一下,在搶占式排程下任務切換的時機有:

(5) 執行中的任務被更高優先順序的任務搶占。

(6) 執行中的任務執行到乙個時間片末尾,被同一優先順序的任務搶占。

FreeRTOS 任務排程 List 組織

嵌入式 freertos 前面了解了 freertos 的記憶體管理,接下來看看任務排程,這也是乙個作業系統中最重要的一部分,而其任務排程大量使用了鍊錶 list.c 實現 排程器使用鍊錶跟蹤不同狀態下的任務 就緒 掛起 延時的任務,都會被掛接到各自的鍊錶中 所以這裡用一定篇幅介紹下主要供排程使用的...

freertos作業系統 任務排程

一 任務建立 目的 應用程式中如何給各任務分配處理時間 任意時刻,os如何使任務投入執行 優先順序如何影響系統行為 任務狀態 如何實現任務 建立乙個或多個任務的例項 任務引數的使用 right 改變任務優先順序 刪除任務 週期性處理 空閒任務何時執行,可以用來幹什麼 解決 任務實現 任務函式 voi...

FreeRTOS簡單任務排程實現

ifndef rtos h define rtos h include freertos.h include task.h define pex rtos start rtos start void rtos start void void freertos task1 void pvparamet...