# 超简单四步完成FreeRTOS移植到STM32
一、资源准备
- FreeRTOS源码:推荐FreeRTOSv9.0.0(稳定性高,适配STM32F4系列,可从官网或正点原子/野火等开源仓库获取)
二、FreeRTOS源码文件夹详解
下载的FreeRTOS压缩包解压后,核心文件夹说明如下:
文件夹 | 作用说明 |
---|---|
FreeRTOS | 核心源码文件夹,移植的主要操作对象 |
Demo | 针对不同MCU/开发板的示例工程(如CORTEX_M4F_STM32F407ZG-SK 是STM32F407的参考例程) |
License | 开源许可协议(MIT许可证,商业/非商业使用均需遵守) |
Source | FreeRTOS内核源码,移植的核心文件 |
include | 通用头文件(如FreeRTOS.h 、task.h ,所有工程都需包含) |
portable | 硬件适配层(连接内核与具体MCU的“桥梁”,需按需保留以下子文件夹) |
Keil | Keil编译器适配文件(确保编译兼容) |
MemMang | 内存管理实现(提供5种内存分配策略,heap_4.c 最常用,支持动态分配与碎片管理) |
RVDS | 针对ARM架构的芯片适配(STM32F407为Cortex-M4F内核,需保留ARM_CM4F 文件夹) |
FreeRTOS-Plus:扩展功能包(如TCP/IP、FAT文件系统等),基础移植无需使用。
三、详细移植步骤
1. 工程结构搭建
- 打开基础裸机工程,在工程根目录新建
FreeRTOS
文件夹(与User
、Library
等文件夹同级)。 - 复制FreeRTOS源码中
FreeRTOS/Source
下的所有文件(包括task.c
、queue.c
、semphr.c
等)到新建的FreeRTOS
文件夹。 - 进入
FreeRTOS/portable
目录,删除无关文件夹(仅保留Keil
、MemMang
、RVDS
,其他如GCC
、IAR
等非Keil环境的文件夹可删除)。
2. 工程文件添加
打开Keil工程,按以下步骤添加文件:
- 新建分组:在工程左侧“Project”窗口右键→“Manage Project Items”,新建两个分组:
FreeRTOS_CORE
(内核文件)和FreeRTOS_PORTABLE
(硬件适配文件)。 - 向
FreeRTOS_CORE
添加文件:选择FreeRTOS
文件夹下的所有.c
文件(如task.c
、queue.c
、semphr.c
,croutine.c
(协程功能)若不使用可不添加,减少编译体积)。 - 向
FreeRTOS_PORTABLE
添加文件:MemMang
文件夹下的heap_4.c
(推荐,支持内存碎片管理)、RVDS/ARM_CM4F
文件夹下的port.c
(Cortex-M4F内核适配文件)。
3. 头文件路径配置
- 在Keil中点击“Options for Target”(魔术棒图标)→“C/C++”→“Include Paths”,添加:
./FreeRTOS/include
(FreeRTOS通用头文件路径);./FreeRTOS/portable/RVDS/ARM_CM4F
(port.c
对应的头文件路径)。
4. 编译报错及解决(逐步处理)
报错1:缺少FreeRTOSConfig.h
- 解决:从源码
FreeRTOS/Demo/CORTEX_M4F_STM32F407ZG-SK
文件夹复制FreeRTOSConfig.h
,粘贴到工程FreeRTOS/include
目录。
报错2:SystemCoreClock
未定义
- 解决:打开
FreeRTOSConfig.h
,修改条件编译,添加SystemCoreClock
声明:#if defined(__ICCARM__) || defined(__CC_ARM__) || defined(__GNUC__)#include <stdint.h>extern uint32_t SystemCoreClock; // 声明系统时钟变量 #endif
报错3:中断服务函数重复定义(PendSV_Handler
、SVC_Handler
、SysTick_Handler
)
- 解决:打开
stm32f4xx_it.c
,注释掉这3个函数的实现(FreeRTOS的port.c
已实现,需用FreeRTOS版本)。
报错4:钩子函数未定义
- 解决:打开
FreeRTOSConfig.h
,关闭未实现的钩子函数:#define configUSE_IDLE_HOOK 0 #define configUSE_TICK_HOOK 0 #define configUSE_MALLOC_FAILED_HOOK 0 #define configCHECK_FOR_STACK_OVERFLOW 0
5. 编译验证
点击Keil“Rebuild”,显示“0 Error(s), 0 Warning(s)”则移植成功。