FreeRTOS任務優先級分配方案

任務優先級說明
下面對 FreeRTOS 優先級相關的幾個重要知識點進行下說明,這些知識點在以後的使用中務必要掌握牢固。

 FreeRTOS 中任務的最高優先級是通過 FreeRTOSConfig.h 文件中的 configMAX_PRIORITIES 進行
配置的,用戶實際可以使用的優先級範圍是 0 到 configMAX_PRIORITIES – 1。比如我們配置此宏定
義爲 5,那麼用戶可以使用的優先級號是 0,1,2,3,4,不包含 5,對於這一點,初學者要特別的注意。
 用戶配置任務的優先級數值越小,那麼此任務的優先級越低,空閒任務的優先級是 0。
 建議用戶配置宏定義 configMAX_PRIORITIES 的最大值不要超過 32,即用戶任務可以使用的優先級
範圍是0到31。因爲對於CM內核的移植文件,用戶任務的優先級不是大於等於32的話, portmacro.h
文件中的宏定義configUSE_PORT_OPTIMISED_TASK_SELECTION會優化優先級列表中要執行的最
高優先級任務的獲取算法(對於 CM 內核的移植文件,此宏定義默認是使能的,當然,用戶也可以在
FreeRTOSConfig.h 文件中進行配置)。 相比通用的最高優先級任務獲取算法,這兩種方式的對比如
下:
   通用方式,沒有優化—配置宏定義 configUSE_PORT_OPTIMISED_TASK_SELECTION 爲 0:
   所有平臺的移植文件都可以配置爲 0,因爲這是通用方式。
   純 C 編寫,比專用方式效率低。
   可用的優先級數量不限制。
   專用方式,進行優化—配置宏定義 configUSE_PORT_OPTIMISED_TASK_SELECTION 爲爲 1:
   部分平臺支持。
   這些平臺架構有專用的彙編指令,比如 CLZ(Count Leading Zeros)指令,通過這些指令可以加速算法執行速度。
   比通用方式高效。
   有最大優先級數限制,通常限制爲 32 個。

 如果用戶在 FreeRTOSConfig.h 文件中配置宏定義 configUSE_TIME_SLICING 爲 1,或者沒有配置

此宏定義,時間片調度都是使能的。 另外,只要芯片資源允許,可以配置任意多個同優先級任務。
(備註:沒有定義 configUSE_TIME_SLICING,也能使用時間片調度是因爲此宏定義默認已經在
FreeRTOS.h 文件中使能)
 FreeRTOS 中處於運行狀態的任務永遠是當前能夠運行的最高優先級任務。 下一章節講解調度器,大
家會對這個知識點有一個全面的認識。

任務優先級分配方案
對於初學者,有時候會糾結任務優先級設置爲多少合適,因爲任務優先級設置多少是沒有標準的。對
於這個問題,我們這裏爲大家推薦一個標準,任務優先級設置推薦方式如下圖13.1 所示:
在這裏插入圖片描述

 IRQ 任務:IRQ 任務是指通過中斷服務程序進行觸發的任務,此類任務應該設置爲所有任務裏面優先級最高的。

 高優先級後臺任務:比如按鍵檢測,觸摸檢測,USB 消息處理,串口消息處理等,都可以歸爲這一類任務。

 低優先級的時間片調度任務:比如 emWin 的界面顯示,LED 數碼管的顯示等不需要實時執行的都可以歸爲這一類任務。 實際應用中用戶不必拘泥於將這些任務都設置爲優先級 1 的同優先級任務,可以設置多個優先級,只需注意這類任務不需要高實時性。
 空閒任務:空閒任務是系統任務。
 特別注意:IRQ 任務和高優先級任務必須設置爲阻塞式(調用消息等待或者延遲等函數即可),只有
這樣,高優先級任務纔會釋放 CPU 的使用權,,從而低優先級任務纔有機會得到執行。
這裏的優先級分配方案是我們推薦的一種方式,實際項目也可以不採用這種方法。 調試出適合項目需求的纔是最好的。

中斷優先級和任務優先級區別
部分初學者也容易在這兩個概念上面出現問題。 簡單的說,這兩個之間沒有任何關係,不管中斷的優
先級是多少,中斷的優先級永遠高於任何任務的優先級,即任務在執行的過程中,中斷來了就開始執行中
斷服務程序。
另外對於 STM32F103,F407 和 F429 來說,中斷優先級的數值越小,優先級越高。 而 FreeRTOS
的任務優先級是,任務優先級數值越小,任務優先級越低。

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