介绍:
Free Real-Time Operating System,免费开源嵌入式实时操作系统
由亚马逊维护,是目前单片机领域使用量最高的 RTOS。
FreeRTOS 通过任务抢占式调度,让传感器采集、串口通信、屏幕刷新、电机控制等多个任务「并发运行」
保证紧急任务立刻响应,实现硬实时控制。
如何使用FreeRTOS
我们打开FreeRTOS的官网
右上角有个github可以点击


(主要是官网没几个版本可以选择)
然后打开Releases然后点击Tags
选择你要安装的版本

准备移植工作
我们打开下载好的压缩包
打开FreeRTOS(不是FreeRTOS-Plus)
FreeRTOS\Source就可以看到代码了
复制文件到工程
1 | your_project/ |
文件的作用
FreeRTOS的工作文件
核心 C 源文件(7个):
文件 是否必须
tasks.c ✅ 必须
queue.c ✅ 必须(包含队列、信号量、互斥量)
list.c ✅ 必须
timers.c ⚠️ 可选(用定时器就需要)
event_groups.c ⚠️ 可选(用事件组就需要)
croutine.c ❌ 很少用(协程)
stream_buffer.c ⚠️ 可选(用流缓冲区就需要)
头文件目录: include/ 下的所有 .h 文件
内存管理文件(选 1 个):
portable/MemMang/heap_4.c ← 推荐
FreeRTOS内存管理
| 内存管理文件 | 是否支持free | 碎片情况 | 推荐使用场景 |
|---|---|---|---|
| heap_1.c | ❌ 不支持 | 无碎片 | 静态创建所有内核对象、高可靠产品 |
| heap_2.c | ✅ 支持 | 碎片较多 | 老旧项目兼容,新项目不推荐 |
| heap_3.c | ✅ 支持 | 取决于编译器 | 依赖 C 标准库堆的项目 |
| heap_4.c | ✅ 支持 | 碎片少 | 绝大多数常规嵌入式项目(首选) |
| heap_5.c | ✅ 支持 | 碎片少 | 需要多段不连续内存(外接 RAM) |
我们一般选择heap_4.c就可以了
FreeRTOS底层文件
portmacro.h — 移植宏定义
仓库里 portable/template/ 下有模板,你需要基于它修改:
数据类型定义(StackType_t、BaseType_t 等)
堆栈增长方向
临界区保护宏(开关中断)
portYIELD() 宏
port.c — 移植 C 实现
仓库里 portable/template/ 下有模板,你需要实现:
xPortStartScheduler() — 启动调度器
vPortEndScheduler() — 停止调度器
pxPortInitialiseStack() — 初始化任务堆栈
vPortYield() — 任务切换
prvTickISR() — 系统滴答中断处理
定时器初始化代码
portASM.S — 汇编上下文切换(可选)
现成的文件
如果你不想底层自己适配FreeRTOS也提供好了现成的代码
portmacro.h 和 port.c 提供了适配的文件
我们打开portable的文件夹里面都是适配好的文件

选择好的你编译器,Arm Compiler 5就是armcc。我们选择RVDS。
然后找到对应的芯片架构,比如STM32F103系列就是M3
我们复制ARM_CM3里面的portmacro.h 和 port.c就可以了
FreeRTOSConfig.h文件编写
最后最关键的就是FreeRTOSConfig.h这个文件,他决定了启用什么功能和调用了什么文件
在官网可以查到如何使用
当然我们也可以从示例里面可以看到
FreeRTOS\Demo 里面看到很多芯片的工程在里面找到你芯片的FreeRTOSConfig.h这个文件,复制到工程里面。
至此准备工作已经完成
尝试编译
基本上只剩下一些简单的问题需要处理。解决小部分的报错情况
这里主要说一个情况,就是STM32的工程。
把stm32f4xx_it.c文件将SVC_Handler 、 PendSV_Handler 、 SysTick_Handler中断服务函数注释掉(删除也可以)
反正最后没报错就是移植成功了