1.有關優先順序 1.1 Configuration --> FreeRTOS MAX_PRIORITIES 設置任務優先順序的數量:配置應用程式有效的優先順序數目。任何數量的任務都可以共用一個優先順序,使用協程可以單獨的給與它們優先權。見MAX_CO_ROUTINE_PRIORITIES。 在RTOS內核 ...
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: |
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