stm32cubemx 配置freertos中斷優先級


 

stm32cubeMx 直接集成freertos,可以不需要自己手動移植只需要把freertos的選項勾選就可以。

但是生成的代碼工程中,freertos暴露給用戶的API接口並不是原生的freertos接口,是經過cmsis-rtos進行一次包裝之后的。所以如果使用信號量、消息郵箱、定時器等等接口的時候要查詢cmsis-rtos文檔,並且cmsis-rtos有不同的版本,現在cubemx中集成的是v1版本,后期有可能會集成v2的。參考鏈接如下:
http://www.keil.com/pack/doc/CMSIS/RTOS/html/index.html

勾選了freertos然后生成工程代碼的時候stm32cubemx會有個提示框彈出來:

它會強烈建議你把timebase源切換到非systick。這一步可能會有很多人搞不清楚,為什么不使用systick而要另外用個定時器。這里首先要弄明白的是這里的HAL timebase並不是freertos的任務調度器時鍾。freertos的調度時鍾是強制性使用systick的並且systick的中斷優先級被設置為最低(這個原因后面敘述)。

這個hal timebase實際上是hal 庫需要使用到的tick計數源,如果深入去看hal庫會發現有很多有超時功能的函數接口就需要用到這個hal timebase。所以生成代碼時候就強烈建議hal timebase和freertos 使用的systick不要共用。systick已經被強制為最低優先級,hal timebase用的話就可能產生計數不准的情況。

那么systick為什么被設置為最低優先級也是有原因的,因為freertos是一個嵌入式實時操作系統,既然能做到實時就要確保中斷能夠立馬得到響應,所以把調度器的時鍾優先級設置為最低就不會影響其他外設中斷的及時響應。否則就稱不上實時。所以一旦在stm32cubemx中勾選了freertos后,systick的優先級自動被設置為最低,不需要用戶再去手動調整。

freertos還有個配置優先級的關鍵選項: configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

  • 高於該配置的優先級中斷中都不能調用freertos的任何API,但是同時他也不會受freertos的內核影響而可以得到最實時的響應。
  • 如果在中斷服務函數中需要使用freertos的API接口函數的話就要把該中斷的優先級配置為小於或等於
    configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

在stm32L0系列單片機的優先級一共有四個等級:0-3,0為最高優先級3為最低。使用freertos以后sytick就在該等級。

把 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 配置為2,這樣特別實時的中斷優先級就可以配置為0或者1,而正常需要調用freertos API的中斷就可以配置為2或者3優先級。分配結果如下圖:


免責聲明!

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



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