一、为什么需要移植?
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的详细步骤



















