FreeRTOS 任務調度算法

FreeRTOS 任務調度算法

配置

在FreeRTOSConfig.h.文件中,可以通過configUSE_PREEMPTION和configUSE_TIME_SLICING配置調度算法。
configUSE_TICKLESS_IDLE也會影響調度算法,它用來降低系統功耗。
在FreeRTOS中,擁有相同優先級的任務會被交替執行,即Round Robin Scheduling(RR);

在RR調度策略下,一個線程會一直運行。直到:

  • 自願放棄控制權
  • 被更高優先級的線程搶佔
  • 時間片用完
    但是RR算法並不能保證同優先級的每個任務執行時間相同

基於時間片的優先級搶佔式調度算法 Prioritized Pre-emptive Scheduling with Time Slicing

配置

在這裏插入圖片描述
相關概念:
在這裏插入圖片描述

示例 每個任務有不同優先級

假設有三個任務,Task1/2/3,Task1有最高優先級;Task2是週期任務,優先級中;Task3優先級低。
在這裏插入圖片描述

  • t5時刻Task3開始運行
  • 當執行到t6時刻,由於Task2週期觸發,且優先級比Task3高,所以調度器將CPU控制權交由Task2
  • t7時刻,Task2運行完成,控制權交還Task3繼續運行
  • t9時刻,Task2週期觸發,開始運行
  • t10時刻,由於Task1優先級最高,此時搶佔CPU,控制權交給Task1
  • t11時刻,Task1結束,控制權交還Task2,Task2繼續運行
  • t12時刻,Task2結束,控制權交還Task3

示例 相同優先級的情況

在這裏插入圖片描述
Task1優先級高於Task2,Task2優先級和空閒任務相同

  • 正常情況下,由於Task2和Idle優先級相同,所以他們交替執行
  • t6時刻,Task1搶佔CPU
  • t7時刻,任務1釋放CPU;由於Task2和Idle是交替執行的,在t5~t8這個時間週期中,Task2開始佔用CPU

這個例子展示了空閒任務和普通任務的交替執行過程。但是,如果空閒優先級任務有工作要做,但空閒任務沒有工作,則可能不需要爲空閒任務分配這麼多處理時間。

我們可以對configIDLE_SHOULD_YIELD進行配置。

  • configIDLE_SHOULD_YIELD = 1
    此時,如果有其他空閒優先級的任務,空閒任務將會讓出控制權
  • configIDLE_SHOULD_YIELD = 0
    此時,除非有高優先級任務搶佔發生,否則空閒任務將會保持運行
    如圖所示:
    在這裏插入圖片描述
    此時configIDLE_SHOULD_YIELD=1。可以看到,空閒優先級任務有了更多的處理時間。

無時間片的優先級搶佔式調度算法 Prioritized Pre-emptive Scheduling (without Time Slicing)

算法保留了調度算法,但是沒有用到時間片來處理相同優先級的任務。

配置

在這裏插入圖片描述

示例

不使用時間片會使得更少的上下文切換,因此,這樣會減小調度器的負載。但是,這樣也會導致相同優先級任務的處理時間不同。如下圖所示,
在這裏插入圖片描述
由於沒有使用時間片,空閒任務會一直佔有CPU,直到Task1搶佔CPU結束後,Task2纔有機會運行。

合作調度 Co-operative Scheduling

配置

在這裏插入圖片描述
當使用合作調度模式時,上下文的切換隻發生在

  1. 正在運行的任務進入阻塞態
  2. 任務調用askYIELD()退出

如圖所示:
在這裏插入圖片描述

示例

在多任務應用時,如果某個資源一次只能被一個任務訪問,否則將會導致程序出錯。那麼,需要用到這個方式。
比如說,當有兩個任務需要通過串口輸出,如果允許搶佔,那麼會導致兩個任務衝突。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章