一、為什么需要移植?
FreeRTOS就像一套"操作系統積木",但不同硬件平臺(如STM32、ESP32、AVR等)的CPU架構和外設差異大,需要針對目標硬件做適配配置。移植工作就是讓FreeRTOS能正確管理你的硬件資源。
二、源碼文件夾大揭秘(新人必看)
???????
FreeRTOS
├── Source ? ? ? ? ??
│ ? ├──?include? ? ??// 內核頭文件(任務、隊列、信號量等API定義)
│ ? └── portable ? ??// 移植專用目錄(不同編譯器/處理器的適配代碼)
│ ? ? ? ├── MemMang ?// 內存管理方案(heap_1.c ~ heap_5.c)
│ ? ? ? ├── GCC ? ? ?// GCC編譯器移植文件
│ ? ? ? ├── IAR ? ? ?// IAR編譯器移植文件
│ ? ? ? └── RVDS ? ??// ARM RealView移植文件(常用ARM_CM3/CM4)
└── Demo ? ? ? ? ? ??// 官方示例代碼(非必需,可參考)
關鍵文件說明:
-
portable/MemMang
-
heap_1.c
:簡單靜態分配(不釋放內存) -
heap_4.c
:帶碎片合并的動態分配(新手推薦) -
heap_5.c
:支持非連續內存區域分配
-
包含5種內存管理方案(類似不同的"內存分配器"):
-
-
portable/[Compiler]/[Architecture]
-
處理器核心移植文件(如
port.c
和portmacro.h
) -
例如:STM32F4使用?
RVDS/ARM_CM4F
?目錄下的文件
-
-
FreeRTOSConfig.h
-
用戶自定義配置文件(需手動創建/復制)
-
位于工程目錄,用于裁剪功能、設置時鐘等參數
-
移植步驟講解
1.首先我們在STM32裸機工程模板根目錄下新建一個文件夾叫“FreeRTOS”,并在該文件夾下在創建兩個文件夾“src”,"port",src文件夾用于保存FreeRTOS中的核心文件,也就是我們常說的“.c文件”,port文件夾中存放管理以及處理器相關代碼,這些代碼FreeRTOS官方提供給我們,直接使用。
FreeRTOS是軟件,我們開發板是硬件,軟硬件中間要有橋梁來連接,這些與處理器架構相關的代碼,可以稱為RTOS硬件接口層,它們位于FreeRTOS/Source/Portable文件夾下
2. 打開FreeRTOS,在目錄“FreeRTOSvXXX\FreeRTOS\Source”找到.c文件,將他們拷貝到我們新建的src文件夾中
3.??打開FreeRTOS,在目錄“FreeRTOSvXXX\FreeRTOS\portable”下找到“MemMang”文件夾與"RVDS'文件夾,將他們拷貝到我們新建的port文件夾
4.?打開FreeRTOS,在目錄“FreeRTOSvXXX\FreeRTOS\Source”目錄下找到"include" 文件夾,它們是我們需要用到FreeRTOS的一些頭文件,將它們直接拷貝到我們新建的FreeRTOS文件夾中,完成這一步就可以看到我們新建的FreeRTOS文件夾已經有3個文件夾,這三個文件夾就包含了FreeRTOS的核心文件,至此FreeRTOS的源碼就提取完成。
5. 拷貝FreeRTOSConfig.h文件到user文件夾
FreeRTOSConfig,h文件是FreeRTOS的工程配置文件,因為FreeRTOS是可以裁剪的實時操作系統,應用于不同處理器平臺,我們可以修改這個文件來裁剪FreeRTOS的功能,一般我們把它拷貝在user文件夾下
6.添加FreeRTOS源碼到工程文件夾
7. 配置FreeRTOS頭文件路徑
8.接下來我們就把文件FreeRTOSConfig.h進行修改
FreeRTOSConfig.h 文件是從 FreeRTOS 的 demo 文件夾下拷貝過來的。該頭文件包含了用于裁剪整個 FreeRTOS 所需功能的宏定義。其中,一些宏定義被啟用,一些被禁用。最初,我們只需要配置最基本的功能。然而,要自由配置 FreeRTOS 的功能,我們需要了解這些宏定義的功能。這樣,其他人也能夠輕松理解并讀懂這些配置。
加上頭文件"stm32f10x.h"
然后再將下述代碼進行復制粘貼FreeRTOSConfig.h文件中
#define?configUSE_TIME_SLICING ?1 ?
//使能時間片調度(默認式使能的)?
#define?configUSE_PORT_OPTIMISED_TASK_SELECTION 1?//硬件計算前導零指令,如果所
使用的, MCU 沒有這些硬件指令的話此宏應該設置為?0?
#define?configUSE_TICKLESS_IDLE ?1 ?
保持系統節拍(tick)中斷一直運行?
#define?configUSE_QUEUE_SETS 1 ? ? ?
#define?configUSE_TASK_NOTIFICATIONS 1 ?
#define?configUSE_MUTEXES ? ?
#define?configUSE_RECURSIVE_MUTEXES 1 ? ?
#define?configUSE_COUNTING_SEMAPHORES 1 ?
#define?configQUEUE_REGISTRY_SIZE 10 ??
#define?configUSE_APPLICATION_TASK_TAG ?0 ?
#define?configSUPPORT_DYNAMIC_ALLOCATION ?1 ?
#define?configUSE_MALLOC_FAILED_HOOK ?0?//使用內存申請失敗鉤子函數?
#define?configCHECK_FOR_STACK_OVERFLOW ?1
#define?configGENERATE_RUN_TIME_STATS 0?//啟用運行時間統計功能?
#define?configUSE_STATS_FORMATTING_FUNCTIONS 1?
#define?configUSE_TIMERS 1 ??
//啟用軟件定時器?
#define?configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) ?
#define?configTIMER_QUEUE_LENGTH 10 ??
//軟件定時器優先級?
//軟件定時器隊列長度?
#define?configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) ?
//可選函數配置選項?
#define?INCLUDE_xTaskGetSchedulerState 1?
#define?INCLUDE_eTaskGetState 1?
#define?INCLUDE_xTimerPendFunctionCall 1?
//中斷服務函數 ?也可以修改起始文件?
#define?vPortSVCHandler ? ? SVC_Handler
#define?xPortPendSVHandler ? ?PendSV_Handler
#define?xPortSysTickHandler ? SysTick_Handler
在port.c文件,寫一個鉤子函數
以上步驟就是移植FreeRTOS的詳細步驟