第 6 章 · FreeRTOS 实时系统入门 章节摘要:裸机程序长到几个功能并发时(采样、通信、显示、按键同时要跑),主循环会迅速纠缠成一团状态标志。本章引入 FreeRTOS:任务给并发画边界,调度器给并发定秩序,队列与信号量给任务递话、给资源上锁。本章以 ESP32 为实验平台(它出厂内置 FreeRTOS,双核跑任务最直观),读完你将能把"传感器采集 + 网络上报 + 串口打印"拆成三个各司其职的任务,并用正确的同步原语让它们协作。 本章学习目标 读完本章并完成后,你应当能够: 判断什么规模的项目值得引入 RTOS,并能说出"事件驱动的裸机状态机"与"RTOS 多任务"的分界线; 创建任务并解释优先级、栈大小、任务函数骨架三要素,跑通双核上多任务并行的例程;
章节摘要:裸机程序长到几个功能并发时(采样、通信、显示、按键同时要跑),主循环会迅速纠缠成一团状态标志。本章引入 FreeRTOS:任务给并发画边界,调度器给并发定秩序,队列与信号量给任务递话、给资源上锁。本章以 ESP32 为实验平台(它出厂内置 FreeRTOS,双核跑任务最直观),读完你将能把"传感器采集 + 网络上报 + 串口打印"拆成三个各司其职的任务,并用正确的同步原语让它们协作。
读完本章并完成后,你应当能够:
RTOS 的世界观:程序是一组并发任务,每个任务是一个带独立栈的无限循环;调度器按优先级把 CPU 时间片分给"此刻最该跑的任务";任务之间不直接碰对方的变量,而是通过队列传数据、通过信号量传事件、通过互斥量保护共享资源。中断保持短小,把脏活丢给任务。
一句话记住本章:任务负责"做什么",调度器负责"何时做",队列与锁负责"怎么交接"。

6.1 任务调度与优先级 —— RTOS 的发动机:任务三要素、抢占式调度规则、阻塞的意义与空闲任务,ESP32 双核例程跑通两个任务并行。
6.2 队列、信号量与互斥量 —— 任务社会的交通规则:用队列传数据、用信号量传事件、用互斥量保护共享资源,重点拆解 ISR 专用 API 与优先级反转。
版本与工具提示:本章代码基于 FreeRTOS 10.x 的 ESP-IDF 封装,API 名与原生 FreeRTOS 完全一致(xTaskCreate、xQueueSend 等),在 STM32CubeIDE 的 FreeRTOS 中间件里同样原样可跑;唯一平台差异是任务栈大小的单位(ESP-IDF 按字节,Cube 按字),创建任务时留意即可。调试工具方面,ESP-IDF 的任务监视命令能实时列出每个任务的优先级、栈水位与 CPU 占用,是学习调度行为最好的观察窗,6.1 节会示范。
RTOS 不是万金油,引入前先过三问。功能是否会并发阻塞:若系统只是"采集、判断、输出"的单循环,事件驱动的裸机状态机(第 3、4 章那套)更小更快更可控;只有当多个功能各自等待各自的慢事件时,任务的隔离才有价值。RAM 是否够用:每个任务一根独立栈,四个任务至少多出十几 KB 的栈预算,20 KB RAM 的 F103 上要精打细算。团队能否驾驭并发:多任务引入的交接与锁问题,比顺序代码更考验纪律。本册的立场是"先写好裸机,再上 RTOS"——只会用 RTOS 掩盖糟糕架构的工程师,裸机同样写不好。
先立发动机(任务与调度),再立交通规则(同步与通信),顺序不可倒——不先理解"任务何时让出 CPU",就无法理解"为什么队列取数据会阻塞也不占 CPU"。这一章同时回收前几章的伏笔:3.2 的"ISR 只置标志"升级为"ISR 发队列",4.1 的节拍中断在 FreeRTOS 里由 SysTick 承担,5.1 的串口接收变成"中断收字节进队列、任务慢慢解析"。学完本章再回头看裸机时代的主循环,你会清楚看到两者的分野:裸机用状态标志编排时间,RTOS 用阻塞与唤醒编排时间。
需要前五章的全部基本功,尤其是中断纪律(3.2、4.1)与串口收发(5.1)。实验平台选 ESP32 是因为 ESP-IDF 原生集成 FreeRTOS 且 API 就叫 FreeRTOS,双核调度直观可见;STM32 上跑 FreeRTOS 只差移植层,概念完全通用。往后看:第 7 章的 OTA 升级就是典型的多任务协作——网络任务收固件包、写入任务刷 Flash、看门狗任务全程守时;MQTT 客户端、蓝牙协议栈这些"高级组件",本质都是别人写好的任务加队列。掌握本章,你就有了拆解它们的坐标系。