FreeRTOS——任務調度—搶占式,時間片和合作式【轉】


轉自:https://www.cnblogs.com/yangguang-it/p/7157072.html

 

以下轉載自安富萊電子: http://forum.armfly.com/forum.php

本章教程為大家將介紹 FreeRTOS 操作系統支持的任務調度方式:搶占式,時間片和合作式,這部分
算是 FreeRTOS 操作系統的核心了。 對於初學者來說,要一下子就能夠理解這些比較困難,需要多花些時
間把這些基本概念搞清楚,然后閱讀下源碼,深入理解實現方法。

關於合作式調度器的特別說明

 

 

FreeRTOS 支持的調度方式
FreeRTOS 操作系統支持三種調度方式:搶占式調度,時間片調度和合作式調度。 實際應用主要是
搶占式調度和時間片調度,合作式調度用到的很少。

搶占式調度
每個任務都有不同的優先級,任務會一直運行直到被高優先級任務搶占或者遇到阻塞式的 API 函數,
比如 vTaskDelay。
時間片調度
每個任務都有相同的優先級,任務會運行固定的時間片個數或者遇到阻塞式的 API 函數,比如
vTaskDelay,才會執行同優先級任務之間的任務切換。


什么是調度器
簡單的說,調度器就是使用相關的調度算法來決定當前需要執行的任務。所有的調度器有一個共同的
特性:
調度器可以區分就緒態任務和掛起任務(由於延遲,信號量等待,郵箱等待,事件組等待等原因而使
得任務被掛起)。
調度器可以選擇就緒態中的一個任務,然后激活它(通過執行這個任務)。 當前正在執行的任務是運
行態的任務。
不同調度器之間最大的區別就是如何分配就緒態任務間的完成時間。
嵌入式實時操作系統的核心就是調度器和任務切換,調度器的核心就是調度算法。任務切換的實現在
不同的嵌入式實時操作系統中區別不大,基本相同的硬件內核架構,任務切換也是相似的。調度算法就有
些區別了。下面我們主要了解一下搶占式調度器和時間片調度器。
搶占式調度器基本概念
在實際的應用中,不同的任務需要不同的響應時間。例如,我們在一個應用中需要使用電機,鍵盤和
LCD 顯示。電機比鍵盤和 LCD 需要更快速的響應,如果我們使用合作式調度器或者時間片調度,那么電
機將無法得到及時的響應,這時搶占式調度是必須的。
如果使用了搶占式調度,最高優先級的任務一旦就緒,總能得到 CPU 的控制權。 比如,當一個運行
着的任務被其它高優先級的任務搶占,當前任務的 CPU 使用權就被剝奪了,或者說被掛起了,那個高優
先級的任務立刻得到了 CPU 的控制權並運行。 又比如,如果中斷服務程序使一個高優先級的任務進入就
緒態,中斷完成時,被中斷的低優先級任務被掛起,優先級高的那個任務開始運行。
使用搶占式調度器,使得最高優先級的任務什么時候可以得到 CPU 的控制權並運行是可知的,同時
使得任務級響應時間得以最優化。
總的來說,學習搶占式調度要掌握的最關鍵一點是:每個任務都被分配了不同的優先級,搶占式調度
器會獲得就緒列表中優先級最高的任務,並運行這個任務。
FreeRTOS 搶占式調度器的實現
如果用戶在 FreeRTOS 的配置文件 FreeRTOSConfig.h 中禁止使用時間片調度, 那么每個任務必須配
置不同的優先級。當 FreeRTOS 多任務啟動執行后,基本會按照如下的方式去執行:
首先執行的最高優先級的任務 Task1, Task1 會一直運行直到遇到系統阻塞式的 API 函數,比如延遲,
事件標志等待,信號量等待,Task1 任務會被掛起,也就是釋放 CPU 的執行權,讓低優先級的任務
得到執行。
FreeRTOS 操作系統繼續執行任務就緒列表中下一個最高優先級的任務 Task2,Task2 執行過程中有
兩種情況:
Task1由於延遲時間到, 接收到信號量消息等方面的原因, 使得 Task1從掛起狀態恢復到就緒態,
在搶占式調度器的作用下,Task2 的執行會被 Task1 搶占。
Task2 會一直運行直到遇到系統阻塞式的 API 函數,比如延遲,事件標志等待,信號量等待, Task2
任務會被掛起,繼而執行就緒列表中下一個最高優先級的任務。
如果用戶創建了多個任務並且采用搶占式調度器的話,基本都是按照上面兩條來執行。 根據搶占式調
度器,當前的任務要么被高優先級任務搶占,要么通過調用阻塞式 API 來釋放 CPU 使用權讓低優先
級任務執行,沒有用戶任務執行時就執行空閑任務。

運行條件:
這里僅對搶占式調度進行說明。
創建 3 個任務 Task1,Task2 和 Task3。
Task1 的優先級為 1,Task2 的優先級為 2,Task3 的優先級為 3。 FreeRTOS 操作系統是設置的數值
越小任務優先級越低,故 Task3 的優先級最高,Task1 的優先級最低。
此框圖是 FreeRTOS 操作系統運行過程中的一部分。
運行過程描述如下:

此時任務 Task1 在運行中,運行過程中由於 Task2 就緒,在搶占式調度器的作用下任務 Task2 搶占
Task1 的執行。 Task2 進入到運行態,Task1 由運行態進入到就緒態。
任務 Task2 在運行中,運行過程中由於 Task3 就緒,在搶占式調度器的作用下任務 Task3 搶占 Task2
的執行。 Task3 進入到運行態,Task2 由運行態進入到就緒態。
任務 Task3 運行過程中調用了阻塞式 API 函數,比如 vTaskDelay,任務 Task3 被掛起,在搶占式調
度器的作用下查找到下一個要執行的最高優先級任務是 Task2,任務 Task2 由就緒態進入到運行態。
任務 Task2 在運行中,運行過程中由於 Task3 再次就緒,在搶占式調度器的作用下任務 Task3 搶占
Task2 的執行。 Task3 進入到運行態,Task2 由運行態進入到就緒態。
上面就是一個簡單的不同優先級任務通過搶占式調度進行任務調度和任務切換的過程。

 

時間片調度器基本概念
在小型的嵌入式 RTOS 中,最常用的的時間片調度算法就是 Round-robin 調度算法。這種調度算法
可以用於搶占式或者合作式的多任務中。另外,時間片調度適合用於不要求任務實時響應的情況。
實現 Round-robin 調度算法需要給同優先級的任務分配一個專門的列表,用於記錄當前就緒的任務,
並為每個任務分配一個時間片(也就是需要運行的時間長度,時間片用完了就進行任務切換)。

FreeRTOS 時間片調度器的實現
在 FreeRTOS 操作系統中只有同優先級任務才會使用時間片調度,另外還需要用戶在
FreeRTOSConfig.h 文件中使能宏定義:
#define configUSE_TIME_SLICING 1
默認情況下,此宏定義已經在 FreeRTOS.h 文件里面使能了,用戶可以不用在 FreeRTOSConfig.h 文
件中再單獨使能。
下面我們通過如下的框圖來說明一下時間片調度在 FreeRTOS 中的運行過程,讓大家有一個形象的認識。

 

運行條件:
這里僅對時間片調度進行說明。
創建 4 個同優先級任務 Task1,Task2,Task3 和 Task4。
每個任務分配的時間片大小是 5 個系統時鍾節拍。
運行過程描述如下:
先運行任務 Task1,運行夠 5 個系統時鍾節拍后,通過時間片調度切換到任務 Task2。
任務 Task2 運行夠 5 個系統時鍾節拍后,通過時間片調度切換到任務 Task3。
任務 Task3 在運行期間調用了阻塞式 API 函數,調用函數時,雖然 5 個系統時鍾節拍的時間片大小
還沒有用完,此時依然會通過時間片調度切換到下一個任務 Task4。 (注意,沒有用完的時間片不會
再使用,下次任務 Task3 得到執行還是按照 5 個系統時鍾節拍運行
任務 Task4 運行夠 5 個系統時鍾節拍后,通過時間片調度切換到任務 Task1。
上面就是一個簡單的同優先級任務通過時間片調度進行任務調度和任務切換的過程。

Summary:

時間片調度和搶占式調度我們一般都是開啟了的,這樣優先級相同時,使用時間片調度,優先級不同時,使用搶占式調度。默認情況下,在freertos.h中使能了時間片調度:

而搶占式調度需要我們用戶自己開啟,一般在freertosconfig.h中使能:

 

歡迎加入作者的小圈子

掃描下方左邊二維碼加入QQ交流群,掃描下方右邊二維碼關注個人微信公眾號並,獲取更多隱藏干貨,QQ交流群:859800032 微信公眾號:Crystal軟件學堂

作者:Crystal軟件學堂
bilibili視頻教程地址:https://space.bilibili.com/5782182
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在轉載文章頁面給出原文連接。
如果你覺得文章對你有所幫助,煩請點個推薦,你的支持是我更文的動力。
文中若有錯誤,請您務必指出,感謝給予我建議並讓我提高的你。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM