[FreeRTOS入門] 1.CubeMX中FreeRTOS配置參數及理解


1.有關優先級

  1.1 Configuration --> FreeRTOS

 

MAX_PRIORITIES

  設置任務優先級的數量:配置應用程序有效的優先級數目。任何數量的任務都可以共享一個優先級,使用協程可以單獨的給與它們優先權。見MAX_CO_ROUTINE_PRIORITIES。 在RTOS內核中,每個有效優先級都會消耗一定量的RAM,因此這個值不要超過你的應用實際需要的優先級數目。

  每一個任務都會被分配一個優先級,優先級值從0~ (MAX_PRIORITIES - 1)之間。低優先級數表示低優先級任務。空閑任務的優先級為0(PriorityIdle),因此它是最低優先級任務。

  FreeRTOS調度器將確保處於就緒狀態(Ready)或運行狀態(Running)的高優先級任務比同樣處於就緒狀態的低優先級任務優先獲取處理器時間。換句話說,處於運行狀態的任務永遠是高優先級任務。

  處於就緒狀態的相同優先級任務使用時間片調度機制共享處理器時間。

Interrupt nesting behaviour configuration

斷言配置

LIBRARY_LOWEST_INTERRUPT_PRIORITY

 

此宏定義是用來配置 FreeRTOS中用到的SysTick中斷和PendSV中斷的優先級reeRTOSreeRTOS reeRTOSreeRTOS 用到 的 SysTSysT ick 中斷和 PendSV 中斷 的優先級。在 NVIC分組設置為4的情況下,此宏定義的范圍就是 0-15 ,即專門配置搶占優先級。這里 即專門配置搶占優先級。這里 配置 為了 15,即 SysTick和 PendSV 都配配置為了最低優先級,實際項目中也建議配置為最低優先級。

LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

定義了受FreeRTOS管理的最高優先級中斷。簡單的說就是允許用戶在這個中斷服務程序里面調用FreeRTOS的API的最高優先級。設置NVIC的優先級分組為4的情況下(全部配置為搶占式優先級。又因為STM32的優先級設置僅使用CM內核8bit中的高4bit,即只能區分2^4 = 16種優先級。因此當優先級分組設置為4的時候可供用戶選擇搶占式優先級為0到15,共16個優先級,配置為0表示最高優先級,配置為15表示最低優先級,不存在子優先級。),配置LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY可以在搶占式優先級為1到15的中斷里面調用FreeRTOS的API函數,搶占式優先級為0的中斷里面是不允許調用的。

Eg:configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 為 0x01 表示用戶可以在搶占式優先級為 1 到 15 的中斷里面調用 FreeRTOS 的 API 函數,搶占式優先級為 0 的中斷里面是不允許調用的。即搶占式優先級為 1 到 15的中斷,均受FreeRTOS管理,0是最高優先級不受FreeRTOS管理。        

Parameter Description:
The highest interrupt priority that can be used by any interrupt service routine that makes calls to interrupt safe FreeRTOS API functions.
DO NOT CALL INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER PRIORITY THAN THIS! (higher priorities are lower numeric values).

 

  1.2 Task and Queues

Priority:任務優先級。STM32Cube對FreeRTOS進行了一些修改,優先級只有7個,優先級從低到高依次是:osPriorityIdle(空閑任務/任務優先級為0)、osPriorityLow、osPriorityBelowNormal、osPriorityNormal、osPriorityAboveNormal、osPriorityHigh、osPriorityRealtime; 

2.有關時鍾配置

  2.1兩個時基

 

轉資料2:[FreeRTOS]請教大家關於新版本CubeMX生成FreeRTOS時選擇時基的問題   http://bbs.armfly.com/read.php?tid=18289&page=e

我也使用生成的代碼,這個問題我估摸着是這樣的。
第一  FreeRTOS 肯定使用的是 systick 

第二  提到的 recommended to use a timebase other 應該說的HAL_IncTick() 還是需要用到的;由於FreeRTOS使用了systick ,所以推薦使用其他的時基源來IncTick


至於為什還要HAL_IncTick()??  原來在這里

這個是 HAL_CAN_Transmit() 其中的一段。。 。 

 問題:

1.當時,

 

2當時,(無論LIBRARY_LOWEST_INTERRUPT_PRIORITY和LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY怎么設置都如下)

轉:systick中斷優先級為15,是否會導致延時不准確?http://www.openedv.com/forum.php?mod=viewthread&tid=269893

我覺得是的,比如串口的中斷搶占優先級設成6(優先級分組是4),那么串口中斷服務函數里的處理就要干凈利索,所謂快進快出,否則耽誤systick的延時處理。 但是應用任務無論優先級多少,都不會對Systick的處理造成影響。

總結,HAL庫函數如CAN通訊用的是HAL_IncTick(),而HAL_IncTick()是CubeMX的TimeBase配置的,這個時候如果需要實時響應,則TimeBase最好為最高優先級0,即根據CubeMX推薦的設置TimeBase為TIM1提供。而原先裸機的HAL系統時鍾用的Systick,現在Systick用到FreeRTOS上的調度,所以要求Systick為最低優先級15,這樣可以保證systick不會對進程造成影響,僅存在延時。而消除延時的手段並不是提高systick的優先級,而是讓中斷服務程序更快。

 

 

轉載:資料

1.FreeRTOS操作系統配置參數說明 . 金濤 https://wenku.baidu.com/view/0289379d8ad63186bceb19e8b8f67c1cfad6eef5.html

2.[FreeRTOS]請教大家關於新版本CubeMX生成FreeRTOS時選擇時基的問題 http://bbs.armfly.com/read.php?tid=18289&page=e

 

 

 


免責聲明!

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



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