FreeRTOS 第一课:初识 FreeRTOS 学习笔记
嵌入式学习笔记 · FreeRTOS 第 1 课
今天开始学习 FreeRTOS:它是什么、有什么用、是谁发明的,以及它的核心概念(任务、调度器、通信机制),整理成文方便复习。
文章目录
- FreeRTOS 第一课:初识 FreeRTOS 学习笔记
-
- 一、FreeRTOS 是什么
- 二、FreeRTOS 的作用(举例子)
-
- 1. 先看裸机开发的痛点
- 2. FreeRTOS 怎么解决
- 3. 举例:智能小车
- 4. 裸机 vs FreeRTOS 对比(示意)
- 三、FreeRTOS 的发明者:Richard Barry
- 四、FreeRTOS 的核心概念(初识版)
-
- 1. 任务(Task)和任务状态机
- 2. 调度器(Scheduler)
- 3. 任务间通信与同步机制
- 五、小结速查表
一、FreeRTOS 是什么
FreeRTOS = Free Real-Time Operating System,一个开源免费的实时操作系统内核,专门为嵌入式单片机(MCU)设计。
- Free:开源免费,可以随意用于商业项目;
- RTOS:Real-Time Operating System,实时操作系统,能在规定时间内响应外部事件;
- 内核(Kernel):只提供操作系统最核心的功能(任务调度、任务通信等),不包含文件系统、网络协议栈等"外挂"组件(需要可自行移植添加)。
| 开源许可 | 内核 MIT 许可,商用免费 |
| 调度方式 | 基于优先级的抢占式调度 + 时间片轮转 |
| 代码规模 | 精简可裁剪,内核约几千行 C 代码 |
| 硬件需求 | 很低,几 KB RAM/Flash 即可运行 |
| 架构支持 | 40+ 种处理器架构(ARM Cortex-M、RISC-V、AVR 等) |
| 开发语言 | 纯 C 语言,可移植性好 |
记忆:FreeRTOS = 给单片机用的"迷你操作系统",任务想跑几个跑几个,还能按优先级抢 CPU。
二、FreeRTOS 的作用(举例子)
1. 先看裸机开发的痛点
很多同学(包括我)最开始写的单片机程序都是"前后台系统":
int main(void)
{
/* 初始化 */
while (1)
{
Read_Sensor(); // 1. 读传感器(可能要等几十 ms)
Process_Data(); // 2. 处理数据(计算量大)
Update_Display(); // 3. 刷新屏幕
Scan_Key(); // 4. 扫描按键
}
}
问题来了:这是一个死循环,只能一个函数一个函数地顺序执行。如果"读传感器"要等很久(比如等 I2C 应答、等 ADC 转换),后面"刷新屏幕""扫描按键"全部被卡住,实时性很差。
| 主循环顺序执行 | 慢任务卡住所有快任务 |
| 中断里做太多事 | 中断服务函数太长,影响系统响应 |
| 多个"同时要做的活" | 只能手动用标志位/定时器轮询切换,代码乱 |
2. FreeRTOS 怎么解决
FreeRTOS 把程序拆成多个独立的任务(Task),每个任务各干各的,由调度器决定谁先运行:
void Task_Sensor(void *arg) { while (1) { Read_Sensor(); vTaskDelay(10); } }
void Task_Display(void *arg) { while (1) { Update_Display(); vTaskDelay(20); } }
void Task_Key(void *arg) { while (1) { Scan_Key(); vTaskDelay(5); } }
- 三个任务"看起来"在同时运行(宏观并行,微观上由调度器快速切换);
- 传感器任务阻塞等待时,CPU 立刻让给显示任务、按键任务;
- 每个任务都可以有自己的优先级,紧急的任务可以抢占不紧急的任务。
3. 举例:智能小车
| 超声波测距 | 在主循环里排队等 40ms 回波 | 独立"测距任务",vTaskDelay 等待 |
| OLED 显示 | 刷新一屏要几 ms,阻塞其他 | 独立"显示任务",优先级最低 |
| 电机调速 | 定时器中断里做 | 独立"电机任务" + 队列接收指令 |
| 按键响应 | 主循环轮询,可能被卡住 | 独立"按键任务",高优先级立刻响应 |
4. 裸机 vs FreeRTOS 对比(示意)

图解析:这是我绘制的调度对比示意图。
- 上半部分(裸机):while(1) 大循环里"传感器 → 处理 → 显示 → 按键"依次执行;一旦某个慢任务(如传感器等待)耗时过长,整个循环被卡住,其他任务全部排队等待;
- 下半部分(FreeRTOS):任务按优先级和时间片快速切换,"传感器/处理/显示/按键/空闲"交错运行;慢任务阻塞时 CPU 立即让给其他就绪任务,空闲时进入空闲任务省电。
一句话:裸机是一列火车排队过桥,RTOS 是立交桥,各走各的车道。
三、FreeRTOS 的发明者:Richard Barry
- Richard Barry(理查德·巴里)是 FreeRTOS 的创始人和主要开发者;
- 2003 年,他开发并开源了 FreeRTOS,最初用于自己的项目,后来免费向全世界发布;
- 因为开源免费 + 轻量可靠,FreeRTOS 迅速成为嵌入式领域使用最广的 RTOS 之一;
- 2017 年,亚马逊 AWS 收购 FreeRTOS,并将其与云服务结合,推出 Amazon FreeRTOS(现在叫 AWS IoT 相关的 FreeRTOS 版本);
- 目前 FreeRTOS 内核在 GitHub 上持续维护更新,依然是 MIT 开源许可。
| 2003 | Richard Barry 开发并发布 FreeRTOS |
| ~2010s | 成为嵌入式市场占有率最高的 RTOS 之一 |
| 2017 | 被亚马逊 AWS 收购,推出 Amazon FreeRTOS |
| 至今 | 内核在 GitHub 开源维护,MIT 许可 |
记忆:FreeRTOS = Richard Barry 2003 年送给大家的"免费实时操作系统礼物",后来被亚马逊收养。
四、FreeRTOS 的核心概念(初识版)
1. 任务(Task)和任务状态机
FreeRTOS 中,每个"干活的小函数"就是一个任务。任务有四种状态:
| 运行(Running) | 正在占用 CPU 执行 | 调度器选中它时 |
| 就绪(Ready) | 想运行,但 CPU 被更高优先级占着 | 一切就绪,等待调度 |
| 阻塞(Blocked) | 在等某件事(延时/队列/信号量) | 调用 vTaskDelay、等待消息等 |
| 挂起(Suspended) | 被暂停,不参与调度 | 调用 vTaskSuspend() |

图解析:这是我绘制的任务状态转换示意图。
- 运行 → 就绪:时间片用完或被更高优先级任务抢占,CPU 让出;
- 就绪 → 运行:调度器选中,获得 CPU;
- 运行/就绪 → 阻塞:等待事件(延时、队列、信号量);
- 阻塞 → 就绪:等待的事件发生;
- 运行/就绪 → 挂起:调用 vTaskSuspend();
- 挂起 → 就绪:调用 vTaskResume();
- 同一优先级的就绪任务之间按时间片轮转(每个任务分到一小段 CPU 时间)。
2. 调度器(Scheduler)
调度器是 FreeRTOS 的"大脑",负责决定"下一个该谁跑":
- 抢占式调度(默认开启):高优先级任务就绪时,立刻打断低优先级任务;
- 时间片轮转:同优先级任务轮流运行,每人分一个时间片(默认 1ms 量级);
- 空闲任务(Idle Task):所有任务都阻塞时,运行最低优先级的空闲任务(可在此休眠省电)。
3. 任务间通信与同步机制
多任务之间需要"传数据、打招呼、互相等",FreeRTOS 提供了多种机制:
| 队列(Queue) | 任务间传递数据(先进先出) | 传纸条的邮箱 |
| 信号量(Semaphore) | 资源计数 / 事件通知 | 停车场空位计数 |
| 互斥量(Mutex) | 保护共享资源,带优先级继承 | 厕所门锁(排队优先) |
| 事件组(Event Group) | 多个事件"与/或"组合等待 | 等好几个快递都到 |
| 软件定时器(Timer) | 周期性回调函数 | 闹钟 |
| 内存管理(heap_1~5) | 动态分配/释放任务栈等 | 内存仓库 |

图解析:这是我绘制的内核组成示意图。中心蓝色的是内核(Kernel),负责任务调度器和时间管理;周围绿色的是内核提供的功能组件:任务、队列、信号量、互斥量、事件组、软件定时器、内存管理(heap_1~5)。任务之间通过队列、信号量等机制通信与同步,这正是 RTOS 与裸机最大的不同——任务不再是孤岛,可以安全地协作。
五、小结速查表
| FreeRTOS 是什么 | 开源免费的嵌入式实时操作系统内核 |
| 发明者 | Richard Barry,2003 年开发 |
| 现在归谁维护 | 亚马逊 AWS(Amazon FreeRTOS),GitHub 开源 |
| 许可协议 | MIT(免费商用) |
| 调度方式 | 优先级抢占 + 时间片轮转 |
| 任务状态 | 运行 / 就绪 / 阻塞 / 挂起 |
| 通信机制 | 队列、信号量、互斥量、事件组 |
| 内存管理 | heap_1 ~ heap_5 五种方案 |
| 支持架构 | 40+ 种(Cortex-M、RISC-V 等) |
记忆口诀:
本文为 FreeRTOS 第一课学习笔记,配图为自绘示意图,如有错误欢迎评论区指正。
网硕互联帮助中心






评论前必须登录!
注册