FreeRTOS 是什么:从裸机大循环到抢占式调度
FreeRTOS 是什么:从裸机大循环到抢占式调度
FreeRTOS 是一个开源的实时操作系统内核,主体是「调度器 + 一组内核对象」。它通常以源码形式编译进固件,和应用程序链接成同一个可执行文件,跑在 Cortex-M 一类的 MCU 上。它本身不提供文件系统、网络协议栈、显示驱动——那些由附加组件或厂商 SDK 提供。它的职责只有一件:在多个并发逻辑(任务)之间按优先级分配 CPU,并给它们提供安全的通信与同步手段。
裸机的写法是一个 while (1) 大循环,顺序调用各个功能模块。功能少的时候这套写法很有效,一旦出现「有几个逻辑各自有自己的时间节拍」的需求,问题就来了:某个模块里的一次长时间等待(例如等一次 ADC 转换完成、等一帧串口数据)会把其他模块全拖住,你只能靠状态机把每个逻辑切成碎片,代码很快变得难以维护。FreeRTOS 把「等待」变成了任务阻塞:等的时候让出 CPU,事件到了再被唤醒。这是它相对裸机最本质的差别。
和相邻方案比,它的定位是轻量、可裁剪、移植层清晰:
- 与裸机状态机相比:代码按逻辑切分到任务里,可读性明显上升,代价是每个任务要一份自己的栈、任务切换有额外开销。
- 与 Zephyr 相比:FreeRTOS 内核更小、更简单,port 移植层的概念清晰,通常随厂商 SDK 一起分发;Zephyr 更接近一个完整系统,构建体系与驱动模型更重。
- 与厂商自研调度器相比:FreeRTOS 的 API 在 STM32、NXP、ESP32 等平台上基本一致,迁移成本低。
先统一术语,后面会反复用到:
| 术语 | 含义 |
|---|---|
| task 任务 | 一个独立的执行流,拥有自己的栈与优先级;本质是一个不会返回的函数 |
| scheduler 调度器 | 决定下一刻让哪个任务上 CPU;由 vTaskStartScheduler 启动 |
| tick | 周期性时基中断,驱动延时与时间片;频率由 configTICK_RATE_HZ 决定 |
| priority 优先级 | 数值越大优先级越高,这一点与 Cortex-M 中断优先级的约定正好相反 |
| blocking 阻塞 | 任务主动让出 CPU 等待事件或超时,而不是空转 |
| critical section 临界区 | 关中断或挂起调度器的一段代码,执行期间不会被切换打断 |

