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
的任務優先級是,任務優先級數值越小,任務優先級越低。
?
總結
以上是生活随笔為你收集整理的FreeRTOS 任务优先级分配方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做一个”合格“的程序员(二)——学习管理
- 下一篇: Wireshark抓取RTP包,还原语音