FreeRTOS學習筆記
在STM32CubeMX下配置FreeRTOS工程
一、 選擇 CMSIS 接口
CMSIS(Cortex Microcontroller Software Interface Standard)是一種面向 ARM Cortex-M 處理器的軟件接口標準。它提供了一組一致的軟件接口,使得針對 Cortex-M 處理器的軟件開發更加簡化和標準化。CMSIS 包含了許多組件,包括設備外設驅動程序、RTOS 抽象層、內核接口等,旨在為開發者提供一致的編程接口,簡化嵌入式軟件開發流程,提高軟件的可移植性和可維護性。
選擇CMSIS-V2可以獲得更多功能和更廣泛的兼容性。
二、 配置HAL庫時基
因為FreeRTOS的時基使用的是Systick,用CubeMX生成的HAL庫使用的默認時基也是Systick,為了避免沖突,需要把HAL庫的時基重新配置
三、 配置FreeRTOS參數
使用STM32CubeMX可以直接添加任務、隊列、信號量、互斥鎖、軟件定時器等,有一個默認任務,此任務無法刪除,只能修改其名稱和函數類型
Kernel settings
- USE_PREEMPTION:
Enabled:RTOS使用搶占式調度器;Disabled:RTOS使用協作式調度器(時間片)。 - TICK_RATE_HZ: 值設置為1000,即周期就是1ms。RTOS系統節拍中斷的頻率,單位為HZ。
- MAX_PRIORITIES: 可使用的最大優先級數量。設置好以后任務就可以使用從0到(MAX_PRIORITIES - 1)的優先級,其中0位最低優先級,(MAX_PRIORITIES - 1)為最高優先級。
- MINIMAL_STACK_SIZE: 設置空閑任務的最小任務堆棧大小,以字為單位,而不是字節。如該值設置為128 Words,那么真正的堆棧大小就是 128*4 = 512 Byte。
- MAX_TASK_NAME_LEN: 設置任務名最大長度。
- IDLE_SHOULD_YIELD:
Enabled: 空閑任務放棄CPU使用權給其他同優先級的用戶任務。
USE_MUTEXES: 為1時使用互斥信號量,相關的API函數會被編譯。 - USE_RECURSIVE_MUTEXES: 為1時使用
遞歸互斥信號量,相關的API函數會被編譯。 - USE_COUNTING_SEMAPHORES: 為1時啟用
計數型信號量, 相關的API函數會被編譯。 - QUEUE_REGISTRY_SIZE: 設置可以注冊的隊列和信號量的最大數量,在使用內核調試器查看信號量和隊列的時候需要設置此宏,而且要先將消息隊列和信號量進行注冊,只有注冊了的隊列和信號量才會在內核調試器中看到,如果不使用內核調試器的話次宏設置為0即可。
- USE_APPLICATION_TASK_TAG: 為1時可以使用vTaskSetApplicationTaskTag函數。
- ENABLE_BACKWARD_COMPATIBILITY: 為1時可以使V8.0.0之前的FreeRTOS用戶代碼直接升級到V8.0.0之后,而不需要做任何修改。
- USE_PORT_OPTIMISED_TASK_SELECTION: FreeRTOS有兩種方法來選擇下一個要運行的任務,一個是通用的方法,另外一個是特殊的方法,也就是硬件方法,使用MCU自帶的硬件指令來實現。STM32有計算前導零指令碼,所以這里強制置1。
- USE_TICKLESS_IDLE: 置1:使能低功耗tickless模式;置0:
保持系統節拍(tick)中斷一直運行。假設開啟低功耗的話可能會導致下載出現問題,因為程序在睡眠中,可用ISP下載辦法解決。 - USE_TASK_NOTIFICATIONS: 為1時
使用任務通知功能,相關的API函數會被編譯。開啟了此功能,每個任務會多消耗8個字節。 - RECORD_STACK_HIGH_ADDRESS: 為1時棧開始地址會被保存到每個任務的TCB中(假如棧是向下生長的)。
Memory management settings
- Memory Allocation: Dynamic/Static 支持動態/靜態內存申請
- TOTAL_HEAP_SIZE: 設置堆大小,如果使用了動態內存管理,FreeRTOS在創建 task, queue, mutex, software timer or semaphore的時候就會使用heap_x.c(x為1~5)中的內存申請函數來申請內存。這些內存就是從堆ucHeap[configTOTAL_HEAP_SIZE]中申請的。
- Memory Management scheme: 內存管理策略
heap_4。-
heap1: 使用靜態數組作為內存池,任務只能分配固定大小的內存塊。這種策略適用于系統資源受限的嵌入式系統,但是不支持動態內存分配和釋放。
-
heap2: 同樣使用靜態數組作為內存池,但是與 heap1 不同的是,heap2 支持動態內存分配和釋放。分配的內存塊大小可以動態變化,但是內存池的大小是固定的。
-
heap3: 使用 malloc 和 free 函數進行內存分配和釋放,可以使用標準的 C 庫函數對內存進行操作。內存池的大小是動態的,可以根據需求動態調整。
-
heap4: 類似于 heap3,但是使用了鎖來保護內存分配和釋放操作,以防止多任務并發訪問時發生沖突。這種策略適用于多任務并發環境。
-
heap5: 類似于 heap4,但是使用了更高級的內存管理算法,以提高內存的利用率和性能。這種策略適用于對內存利用率和性能有較高要求的系統。
-
Hook function related definitions
- USE_IDLE_HOOK: 置1:使用空閑鉤子(Idle Hook類似于回調函數);置0:忽略空閑鉤子。
- USE_TICK_HOOK: 置1:使用時間片鉤子(Tick Hook);置0:忽略時間片鉤子。
- USE_MALLOC_FAILED_HOOK: 使用內存申請失敗鉤子函數。
- CHECK_FOR_STACK_OVERFLOW: 大于0時啟用堆棧溢出檢測功能,如果使用此功能用戶必須提供一個棧溢出鉤子函數,如果使用的話此值可以為1或者2,因為有兩種棧溢出檢測方法。
Run time and task stats gathering related definitions
- GENERATE_RUN_TIME_STATS:啟用運行時間統計功能。
- USE_TRACE_FACILITY: 啟用可視化跟蹤調試。
- USE_STATS_FORMATTING_FUNCTIONS: 與宏configUSE_TRACE_FACILITY同時為1時會編譯下面3個函數prvWriteNameToBuffer()、vTaskList()、vTaskGetRunTimeStats()。
Co-routine related definitions
- USE_CO_ROUTINES: 啟用協程。
- MAX_CO_ROUTINE_PRIORITIES: 協程的有效優先級數目。
Software timer definitions
- USE_TIMERS: 啟用軟件定時器。
Interrupt nesting behaviour configuration:
- LIBRARY_LOWEST_INTERRUPT_PRIORITY: 中斷最低優先級。
- LIBRARY_LOWEST_INTERRUPT_PRIORITY: 系統可管理的最高中斷優先級。
參考:https://blog.csdn.net/w237838/article/details/133965647
創建任務
TimerHandle_t icnTimer;
const osThreadAttr_t ledTask_attributes = {
.name = "ledTask",
.stack_size = 128 * 4,
.priority = (osPriority_t)osPriorityNormal,
};
void LedTask(void *argument) {
for (;;) {
osDelay(1);
}
}

浙公網安備 33010602011771號