STM32用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
的任務優先級是,任務優先級數值越小,任務優先級越低。


免責聲明!

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



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