FreeRTOS 操作系統學習(三) 調度

                                                              FreeRTOS 操作系統學習

2  調度

        任務調度的目的旨在決定某個時刻哪個任務可以由“就緒(Ready)”態進入運行狀態。FreeRTOS 通過在任務創建時賦予任務不同的優先級來實現這一調度(參考 1.2章節)。任務優先級是調度器決定任務切換的唯一指標。

       調度器會在每個時鐘節拍中斷產生時判斷一次哪個任務需要被喚醒,哪個需要進入就緒態。如圖3

                                                                      

                                                     圖3  節拍中斷產生時判斷一次哪個任務需要被喚醒,哪個需要進入就緒態

2.1 優先級

     FreeRTOS通過任務優先級的處理來實現多任務調度。優先級 是任務在創建時被賦予的一個數值,也可以通過vTaskPriorityGet()  vTaskPrioritySet() 函數來讀取或設置(參考 FreeRTOS manual). 沒有優先級的自動管理,這意味着除非程序修改,否則任務始終保持固定的優先級運行。優先級的值越小意味着優先級越低。優先級0是任務可以具有的最低優先級,
此級別應嚴格保留用於空閒任務。應用程序中的最後一個可用優先級(較高的值)是可用於任務的最高優先級。FreeRTOS對它處理的優先級數量沒有限制。最大優先級數在FreeRTOSConfig.h的MAX_PRIORITIES常量中定義(請參閱第8.1節),硬件限制(MAX_PRIORITIES類型的寬度)。如果爲任務分配了一個大於MAX_PRIORITIES的值,則FreeRTOS會將其值默認爲MAX_PRIORITIES – 1。圖4給出了在FreeRTOS中運行的應用程序的示例。任務1和任務3是基於事件的任務(當事件發生時,開始運行,然後等待事件再次發生),任務2是週期性的空閒任務確保始終有任務在運行。

      通過此任務管理,可以實現“單調速率調度(RMS)”以進行任務調度 : 頻率較高的任務被賦予較高的優先級,而頻率較低的任務則應享有較低的優先級。基於事件或連續任務會被定期任務搶佔

                                  

                                                                                    圖4 FreeRTOS應用時間表示意圖

2.2  同優先級任務

       創建多個相同的優先級任務,對於調度器而言將同等對待: 如果其中有兩個同時處於“就緒”態,調度器會把時間平均分給這兩個同優先級的任務:調度器在每個時鐘節拍都會就緒任務中選擇一個優先級最高的任務切入運行態。這實現了“輪轉調度(Round Robin)”其中調度的間隙即每個時鐘節拍之間的時間。 此值在FreeRTOSConfig.h中的TICK_RATE_HZ常量中設置(第8.1節)。

                                                

                                                                                           圖5  同優先級任務調度示意

     2.3 飢餓

           FreeRTOS中沒有實現防止任務飢餓的機制 : 程序員必須確保沒有優先級更高的任務佔用所有運行時間。讓空閒任務運行也是一個好主意,因爲它可以處理一些重要的工作,例如從已刪除的任務中釋放內存,或者將設備切換到睡眠模式。

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