向裸机工程添加FreeRTOS源码
先了解一下有哪些文件:Freertos文件组成
1. 下载源码
FreeRTOS GitHub Releases 页 下载源码压缩包,解压后按下面的步骤搬文件
2. 工程中新建文件夹
工程根目录/
└─ FreeRTOS/
├─ src/ ← 内核 .c 文件
├─ port/ ← 移植层
└─ include/ ← 内核头文件
3. 复制内核头文件
源码包 FreeRTOS/Source/include/ 整个文件夹复制到工程 FreeRTOS/ 下,与 src、port 同级(即 FreeRTOS/include/)
4. 复制内核源码与移植层
FreeRTOS/Source/下所有.c(tasks.c、queue.c、list.c、timers.c、event_groups.c、stream_buffer.c、croutine.c)→FreeRTOS/src/FreeRTOS/Source/portable/下复制MemMang和RVDS两个文件夹 →FreeRTOS/port/- 提示:老版源码 Keil 对应目录是
RVDS(AC5 编译器);新版 FreeRTOS-Kernel 改叫ARMClang(AC6)或Keil,任选其一
- 提示:老版源码 Keil 对应目录是
5. 复制 FreeRTOSConfig.h
官方 Demo 里有现成模板:FreeRTOS/Demo/CORTEX_STM32F103_Keil/FreeRTOSConfig.h(任意芯片 demo 都行,后续按需裁剪)→ 放到 FreeRTOS/include/ 里(头文件路径已经加了 include,不用再单独配)
6. Keil 工程分组
工程管理里新建两个组,添加文件:
| 组 | 添加的文件 |
|---|---|
| FreeRTOS/src | src 下所有 .c |
| FreeRTOS/port | port\RVDS\ARM_CM4F\port.c + port\MemMang\heap_4.c(heap 只能选 1 个) |
ARM_CM? 按 MCU 内核选:
| MCU 内核 | 目录 |
|---|---|
| Cortex-M0 / M0+ | ARM_CM0 |
| Cortex-M3(STM32F1) | ARM_CM3 |
| Cortex-M4 无 FPU | ARM_CM4 |
| Cortex-M4F(STM32F4) | ARM_CM4F |
| Cortex-M7 | ARM_CM7 |
查内核方法:芯片数据手册 / Keil 工程 Device 页看内核名;型号也能猜(F1 后缀 1 → M3,F4 后缀 4 → M4F)
7. 添加头文件路径
Options for Target → C/C++ → Include Paths 添加:
FreeRTOS\include
FreeRTOS\port\RVDS\ARM_CM4F
(ARM_CM4F 换成第 6 步实际选的目录)
8. 中断处理(改 FreeRTOSConfig.h,不动 .s 文件)
在 FreeRTOSConfig.h 的末尾添加 3 行宏定义,强定义自动覆盖启动文件的弱符号,将 FreeRTOS 的中断处理函数名映射为标准中断名:
/* FreeRTOSConfig.h 末尾添加 */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler然后去 stm32f10x_it.c / stm32f4xx_it.c 中:将原本由编译器/官方库自动生成的 SVC_Handler、PendSV_Handler、SysTick_Handler 三个函数直接注释或删掉(port.c 已经通过宏接管了这三个函数的同名定义,不删会报 symbol multiply defined 重复定义错误)