06-学习路径

FreeRTOS 学习路径(零基础 → 精通)

适用对象:熟悉 C 语言、初次接触嵌入式开发的程序员
代码基线:本目录 FreeRTOS-LTS 202406.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:六个必须提前知道的坑

  1. 别一上来就啃 AWS IoT 全套。 monorepo 有 16 个组件,初学者进去 = 淹死。Phase 4 之前只碰 FreeRTOS-Kernel/。
  2. 中断里必须用 ...FromISR 版本的 API。 用错不会立刻报错,但会在某个深夜随机死机。
  3. xTaskCreate 的栈大小单位是 StackType_t 个数,不是字节。 Cortex-M 上 1 个 = 4 字节,写 128 其实是 512 字节。
  4. 别用 CubeMX 生成的 FreeRTOS 来学内核。 它把中间层藏起来了,你会"能跑但不懂"。Phase 3 之后可以用它加速开发。
  5. ESP-IDF 的 FreeRTOS 是高度定制的分支。 API 名字一样但内部不同,学内核阶段会误导你。
  6. 中断优先级的两套相反约定(见 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 —— 当索引查,别当教材读
posted @ 2026-10-12 00:18  nuanshu  阅读(7)  评论(0)    收藏  举报