06-学习路径
FreeRTOS 学习路径(零基础 → 精通)
适用对象:熟悉 C 语言、初次接触嵌入式开发的程序员
代码基线:本目录FreeRTOS-LTS202406.01(Kernel V11.1.0)
建议节奏:每周 10~15 小时
0. 使用说明:这五个视图文件该怎么用
同目录下的 01~05 五个 MD 描述的不是 FreeRTOS 内核,而是 FreeRTOS LTS 发行版 + 全套 AWS IoT 云栈——03-开发视图 §1 的 monorepo 里有 16 个子仓库。
整个 FreeRTOS 内核,在 01-逻辑视图 里只占 §3 的一节(一张 9 行的模块表)。
⚠️ 初学者最大的错误,就是照着这个发行版的目录结构去学。
前 3 个月只碰FreeRTOS/FreeRTOS-Kernel/这一个目录,其它 15 个组件全部无视。
这五个文件的正确用法是地图和词典:学到一个概念时,回头查它挂在架构图的哪里、和谁有依赖关系。不要从第一行读到第一百行。
| 视图文件 | 什么时候才真正有用 |
|---|---|
02-进程视图 |
Phase 1-2(任务模型、并发机制、状态机、优先级继承) |
01-逻辑视图 §3 |
Phase 2(内核模块表 = 源码阅读清单) |
01-逻辑视图 §7 |
Phase 2-3(ADR 架构决策) |
03-开发视图 §2/§3/§4 |
Phase 3(可移植层设计、构建、配置体系) |
03-开发视图 §5 |
Phase 5(MISRA / 单元测试 / CBMC) |
01-逻辑视图 §4、04-物理视图 |
Phase 4(TCP 栈、部署与容量规划) |
01-逻辑视图 §5/§6、05-场景视图 |
Phase 4-5(IoT 协议库、AWS IoT、OTA) |
1. 总路线图
Phase 0 嵌入式基础补齐 3-4 周 ← 补的不是 FreeRTOS,是"裸机"
Phase 1 内核 API 使用 3-4 周 ← 会用
Phase 2 内核源码精读 4-6 周 ← 懂原理 【分水岭】
Phase 3 移植与配置 3-4 周 ← 能落地 【分水岭】
Phase 4 中间件(TCP/MQTT/TLS) 6-8 周 ← 视图文件在这里启用
Phase 5 生产级能力 持续 ← 精通
按每周 10-15 小时计算:Phase 0→4 约 6 个月可独立完成产品级 FreeRTOS 项目;Phase 5 持续 1 年以上才谈得上"精通"。
时间不要压缩,尤其 Phase 0 和 Phase 2——跳过它们的代价是后面每一步都在猜。
Phase 0:嵌入式基础补齐(3-4 周)
你有 C 语言基础是最大优势,但嵌入式有它自己的"方言"。
1.1 知识清单
| 主题 | 要到的程度 | 自检 |
|---|---|---|
| MCU 内存模型 | Flash / RAM 的区别,.text/.data/.bss 各占哪,链接脚本 .ld 怎么读 |
[ ] |
| 启动流程 | 复位向量表 → Reset_Handler → 拷贝 .data、清零 .bss → main() |
[ ] |
| 时钟树 | HSE/HSI → PLL → SYSCLK → AHB/APB 分频,算出外设真实频率 | [ ] |
| 寄存器编程 | 不用库函数,直接写 GPIOA->ODR,理解"寄存器就是内存地址" |
[ ] |
| 中断 | 中断向量表、NVIC 优先级分组、抢占优先级 vs 子优先级 | [ ] |
| 工具链 | 交叉编译、arm-none-eabi-gcc、Makefile/CMake、烧录 |
[ ] |
| 调试 | SWD 连接、断点、查看寄存器/内存、串口 printf 重定向 | [ ] |
1.2 动手实验(必须做,不能只看)
1.3 过关标准
不用 CubeMX、不用 HAL,能凭数据手册从零建一个工程,跑通 GPIO + UART + 定时器中断。
1.4 资源
- 《ARM Cortex-M3 与 Cortex-M4 权威指南》(Joseph Yiu) —— 前 6 章
- B 站「江协科技 STM32」免费教程(零基础首选,基于 F103)
⚠️ 这个阶段完全不用 FreeRTOS。跳过它直接上 RTOS,Phase 2 读
port.c的 PendSV 汇编时会彻底卡死。
Phase 1:内核 API 使用(3-4 周)
唯一的"快乐"阶段——API 简单、马上见效。但别停在这里就以为会 FreeRTOS 了。
1.1 学习顺序(严格按序,每步建立在前一步之上)
| 序 | 主题 | 关键 API | 对应视图 | 完成 |
|---|---|---|---|---|
| 1 | 任务创建与延时 | xTaskCreate vTaskDelay vTaskDelayUntil vTaskDelete |
02 §5 状态机 |
[ ] |
| 2 | 优先级与抢占 | vTaskPrioritySet uxTaskPriorityGet |
02 §1 |
[ ] |
| 3 | 队列 | xQueueCreate xQueueSend/Receive xQueueSendFromISR |
02 §4 |
[ ] |
| 4 | 信号量 | xSemaphoreCreateBinary/Counting xSemaphoreGive/Take |
02 §4 |
[ ] |
| 5 | 互斥量 | xSemaphoreCreateMutex + 优先级继承 |
02 §3.5 |
[ ] |
| 6 | 任务通知 | xTaskNotifyGive ulTaskNotifyTake ...FromISR |
最快最省内存的同步 | [ ] |
| 7 | 事件组 | xEventGroupSetBits xEventGroupWaitBits |
02 §4 |
[ ] |
| 8 | 软件定时器 | xTimerCreate xTimerStart/Stop/Reset |
02 §3.4 |
[ ] |
| 9 | 流/消息缓冲 | xStreamBufferCreate xStreamBufferSend/Receive |
中断→任务数据流 | [ ] |
| 10 | 内存管理 | heap_1~5 的差异,选 heap_4 | 01 §3.2 |
[ ] |
1.2 必做实验(每个都亲手敲,不要抄)
第 4 个实验做透了,你对 RTOS 的理解就超过一半人。
1.3 过关标准
能用「任务 + 队列 + 信号量」设计一个多任务程序,并说清每个任务的优先级为什么这么定。
1.4 资源
- 《Mastering the FreeRTOS Real Time Kernel》—— 已下载到
books/:
中文版在books/Mastering-the-FreeRTOS-Real-Time-Kernel-CN/(Markdown),
英文原版是books/Mastering-the-FreeRTOS-Real-Time-Kernel-EN.pdf。
只读前半本(任务管理 / 队列管理 / 软件定时器 / 中断管理 / 资源管理),
事件组、任务通知、故障排除留到 Phase 2。
⚠️ 版本说明和章节-Phase 对照表见books/00-目录与阅读指引.md
Phase 2:内核源码精读(4-6 周)【分水岭】
从"会用"到"懂"的分水岭。 内核核心只有 6 个 .c 文件、约 1.5 万行,完全读得完。
2.1 阅读顺序(必须按此顺序,前面是后面的基础)
list.c → 侵入式双向链表,调度器的数据结构地基
↓
tasks.c → TCB 结构、就绪链表、vTaskSwitchContext、xTaskIncrementTick
↓
queue.c → 队列/信号量/互斥量的统一实现(本质是同一个东西)
↓
timers.c → 守护任务模型、双活动链表处理 Tick 回绕
↓
event_groups.c → 位掩码同步
↓
stream_buffer.c → 环形缓冲、ISR 安全
直接对照
01-逻辑视图 §3.1的模块表逐行读——那张表列出了每个模块的关键文件、核心数据结构、核心 API,就是你的源码阅读清单。
2.2 读源码时要回答的问题
2.3 用调试器验证(极大加深理解)
2.4 过关标准
能白板画出「任务从阻塞→就绪→运行」时内核修改的链表;能解释优先级继承的实现;能解释事件组和队列在实现上的复用关系。
Phase 3:移植与配置(3-4 周)【分水岭】
这一步是「嵌入式」和「通用编程」真正的分界线。
3.1 主题清单
| 主题 | 关键文件 / 概念 | 完成 |
|---|---|---|
| 可移植层结构 | portable/<编译器>/<架构>/port.c + portmacro.h |
[ ] |
| 三个异常 | SVC(启动第一个任务)、PendSV(上下文切换)、SysTick(心跳) | [ ] |
| 上下文切换汇编 | xPortPendSVHandler 逐行读:压栈 → 保存 SP 到 TCB → 选新任务 → 恢复 |
[ ] |
| 临界区实现 | portENTER_CRITICAL 如何关中断、vPortEnterCritical 的嵌套计数 |
[ ] |
| 中断优先级 | configMAX_SYSCALL_INTERRUPT_PRIORITY、configKERNEL_INTERRUPT_PRIORITY |
[ ] |
| 配置体系 | examples/template_configuration/FreeRTOSConfig.h(154 项)逐条搞懂 |
[ ] |
| 构建系统 | examples/cmake_example/:FREERTOS_PORT、FREERTOS_HEAP、freertos_config 目标 |
[ ] |
3.2 核心练习
不用 CubeMX 生成的 FreeRTOS,自己从零搭一个工程——只拿
FreeRTOS-Kernel/源码 + 自己的FreeRTOSConfig.h+portable/GCC/ARM_CM4F/,用 CMake 或 Makefile 编译到板子上跑起来。
做完这一步,你就从「FreeRTOS 使用者」变成了「能把它搬到任何芯片上的人」。
3.3 ⚠️ 本阶段最大的坑
configMAX_SYSCALL_INTERRUPT_PRIORITY:
Cortex-M 的中断优先级数值越小越高,而 FreeRTOS 的任务优先级数值越大越高——两套相反的约定同时存在于一份代码里。搞错会导致随机的 HardFault,而且极难排查。这个坑必须在这一阶段踩明白。
Phase 4:中间件(6-8 周)—— 视图文件在这里才真正启用
| 周次 | 内容 | 对应文件 |
|---|---|---|
| 1-3 | FreeRTOS-Plus-TCP:xNetworkInterfaceInitialise/Output 契约、prvIPTask 事件循环、DHCP/DNS、socket API |
01 §4、02 §3.2/3.3 |
| 4-6 | coreMQTT + TLS:MQTTTransportInterface_t 解耦设计、corePKCS11 + mbedTLS、QoS 状态机 |
01 §5.1、02 §3.6 |
| 7-8 | 可靠性:backoffAlgorithm 指数退避、断线重连、看门狗 | 05 S8 |
按场景编号逐项实现
过关标准
设备能通过 MQTT 把数据发到你自己 PC 上跑的 Mosquitto broker。
⚠️ 先用本地 broker,不要一上来就搞 AWS IoT(那会把调试难度放大 10 倍)。
Phase 5:生产级能力(持续)
方向分叉,按兴趣选(可叠加):
A. 深度方向(内核专家)
B. 工程化方向
C. 云集成方向(视图文件的终点)
附录 A:硬件采购清单
A.1 核心板(三选一)
| 方案 | 价格 | 说明 |
|---|---|---|
| STM32F103C8T6 最小系统板(蓝板) | ¥15-30 | Cortex-M3 / 72MHz / 64KB Flash / 20KB RAM。够跑全部内核实验。资料最多(正点原子、野火、江协科技教程都基于它)。RAM 小反而是好事——逼你学会算栈大小。缺点:跑不了 TCP/MQTT |
| NUCLEO-F446RE(推荐) | ¥120-180 | Cortex-M4F / 180MHz / 512KB Flash / 128KB RAM。板载 ST-Link(省一个调试器的钱)、Arduino 兼容接口、官方支持好 |
| STM32F407 探索者 / 霸天虎 | ¥150-400 | Cortex-M4F / 168MHz / 1MB Flash / 192KB RAM。带以太网 PHY(LAN8720)——Phase 4 跑 Plus-TCP 的关键。中文配套资料最全。选带板载调试器的套餐 |
建议:先买一块 F103C8T6(¥20)验证自己能否坚持,两周内没放弃,再上 NUCLEO-F446RE 或 F407 探索者。
一次性买最贵的板子然后吃灰,是最常见的浪费。
A.2 必备配件
| 配件 | 价格 | 为什么必须 |
|---|---|---|
| ST-Link V2 调试器 | ¥15-25 | 单步调试是学 RTOS 的命脉。没有调试器只能靠 printf 猜,效率差 10 倍。(买 Nucleo/Discovery 板则板载自带) |
| USB-TTL 模块(CH340) | ¥6-10 | printf 输出 |
A.3 强烈推荐(非必需,性价比极高)
| 配件 | 价格 | 用途 |
|---|---|---|
| 逻辑分析仪(8 通道 24MHz 廉价版)+ PulseView/Sigrok | ¥20-40 | 实测任务切换时序、测量中断延迟。在 GPIO 上翻转电平量任务响应时间——唯一能让你"看见"实时性的工具 |
| Raspberry Pi Pico(RP2040) | ¥25-40 | 本源码树有 portable/ThirdParty/GCC/RP2040,支持双核 SMP FreeRTOS,Phase 5 玩双核成本极低 |
| ESP32-C3 开发板 | ¥20-35 | 自带 WiFi,Phase 4 做 IoT 不用买以太网板。⚠️ ESP-IDF 把 FreeRTOS 深度定制了,Phase 1-3 学内核阶段绝对不要用它 |
A.4 推荐组合
- 极简起步(¥50):F103C8T6 + ST-Link V2 + CH340 —— 够走完 Phase 0-3
- 推荐配置(¥200-350):NUCLEO-F446RE(含调试器)+ CH340 + 逻辑分析仪 —— 够走完 Phase 0-4
- 完整配置(¥350-500):上面的 + ESP32-C3 + Pico —— 覆盖 Phase 5
附录 B:六个必须提前知道的坑
- 别一上来就啃 AWS IoT 全套。 monorepo 有 16 个组件,初学者进去 = 淹死。Phase 4 之前只碰
FreeRTOS-Kernel/。 - 中断里必须用
...FromISR版本的 API。 用错不会立刻报错,但会在某个深夜随机死机。 xTaskCreate的栈大小单位是StackType_t个数,不是字节。 Cortex-M 上 1 个 = 4 字节,写 128 其实是 512 字节。- 别用 CubeMX 生成的 FreeRTOS 来学内核。 它把中间层藏起来了,你会"能跑但不懂"。Phase 3 之后可以用它加速开发。
- ESP-IDF 的 FreeRTOS 是高度定制的分支。 API 名字一样但内部不同,学内核阶段会误导你。
- 中断优先级的两套相反约定(见 Phase 3)—— 最高频的 HardFault 来源。
附录 C:本机模拟环境(已搭好,零硬件起步)
在买板子之前,先用 Windows 本机把 FreeRTOS 跑起来,练习 Phase 1 的 API。
C.1 工程位置
E:\FreeRTOSv202406.01-LTS\
├── FreeRTOS-LTS\ 源码树 + 五个视图 MD + 本文件
└── freertos-sim\ ★ 模拟器工程(已跑通)
├── main.c 4 个任务:生产者/消费者/心跳/监控
├── config\FreeRTOSConfig.h 内核配置,每项都有中文注释
├── compat\timeapi.h 兼容垫片(见 C.3)
├── Makefile 零依赖构建(推荐)
├── CMakeLists.txt CMake 构建(可选)
└── README.md 详细说明 + 7 个建议实验
C.2 怎么跑
在 Git Bash 里(两种方式,都已验证可用):
cd E:/FreeRTOSv202406.01-LTS/freertos-sim
# 方式一:Makefile(零依赖,推荐日常用)
mingw32-make run # 注意本机是 mingw32-make,不是 make
# 方式二:CMake(体现 03-开发视图 §3 的官方构建体系)
cmake -S . -B build -G "MinGW Makefiles"
cmake --build build
./build/freertos-sim.exe
跑起来会看到生产者/消费者通过队列交互,8 秒后打印任务状态表:
================ 任务状态表 ================
Name State Prio Stack Num
Monitor X 1 125 4
Heartbeat R 1 125 3
IDLE R 0 125 5
Producer B 2 125 1
Consumer B 3 125 2
Tmr Svc B 6 253 6
============================================
heap_4 剩余堆空间:121944 字节
把这张表和 02-进程视图 §2 的任务清单对照看——视图里写的 IDLE 和 Tmr Svc,
在这里是活生生存在的两个内核自动创建的任务。State 列(X运行/R就绪/B阻塞)
就是 02-进程视图 §5 那张状态机的实际快照。
C.3 环境说明
| 项 | 实际配置 |
|---|---|
| 编译器 | MinGW-w64 x86_64 GCC 7.3.0(本机已有) |
| 构建(方式一) | mingw32-make(本机没有 make,命令要写全名) |
| 构建(方式二) | CMake 4.4.4,位于 C:\Program Files\CMake\bin,已写入系统 PATH |
| 移植层 | portable/MSVC-MingW(每个 FreeRTOS 任务 = 一个 Windows 线程) |
| 内存策略 | heap_4 |
| 链接库 | winmm(Windows 多媒体库,模拟 Tick 定时器) |
| 已知警告 | port.c:254 有个 -Wpragmas 警告(GCC 7.3 不认识 -Wcast-function-type),无害可忽略 |
| 兼容垫片 | compat/timeapi.h 只有一行 #include <mmsystem.h>,用来补上旧版 MinGW 缺失的 timeapi.h 文件名。没有改内核任何代码 |
💡 装完 CMake 后需要重开一个终端,旧终端里 PATH 还是安装前的,
会报cmake: command not found。新装的 CMake 用的是系统级 PATH,重开即可。💡 如果哪天升级到新的 MinGW / MSYS2 工具链,删掉
compat\目录、
去掉Makefile里的-Icompat即可。
📌 CMake 编译时会打印内核每个源文件的编译过程,那 8 行输出正好是
01-逻辑视图 §3模块表的实物清单:
croutine / event_groups / list / queue / stream_buffer / tasks / timers+heap_4
—— 这就是 Phase 2 要精读的全部源码。
C.4 ⚠️ 边界:模拟器能做什么、不能做什么
能:练 Phase 1 的全部 API、观察任务状态与队列行为、故意搞坏它看竞态。
不能:理解实时性。它的 Tick 建立在 Windows 多媒体定时器上,
任务切换是 Windows 线程挂起/恢复——根本不是真的上下文切换。
Phase 3 之后必须上真实硬件。
freertos-sim/README.md§7 列了从模拟器迁到
STM32 需要改动的全部项目,到时候照着改即可。
📌 另注:
FreeRTOS-Kernel/examples/cmake_example/CMakeLists.txt默认的FREERTOS_PORT
是"TEMPLATE"(一个空实现,跑起来什么都不会发生)。真要跑,Windows 上要改成
MSVC_MINGW,硬件上要改成GCC_ARM_CM4F之类。
附录 D:资源清单
| 类型 | 推荐 |
|---|---|
| 主教材 | 见 books/00-目录与阅读指引.md —— 英文原版 PDF + 社区中文翻译(13 章)已下载到本地,含章节与 Phase 的对应表 |
| 硬件基础 | 《ARM Cortex-M3 与 Cortex-M4 权威指南》(Joseph Yiu) —— Phase 0/3 |
| 视频 | B 站「江协科技」STM32 入门教程;正点原子 / 野火 FreeRTOS 专题 |
| 权威参考 | freertos.org 官方 API 文档;内核源码本身 + examples/template_configuration/FreeRTOSConfig.h 的注释 |
| 本目录视图文件 | 01~05 —— 当索引查,别当教材读 |

浙公网安备 33010602011771号