NO.11 · 嵌入式开发
FreeRTOS 实时操作系统:从裸机到多任务调度
FreeRTOS 实时操作系统学习笔记,覆盖任务调度、内核移植、消息队列、信号量、事件组、任务通知、软件定时器、Tickless 低功耗与内存管理。
裸机程序写到一定程度,总会遇到”多个任务如何同时运行”的问题。这份笔记整理 FreeRTOS 的完整学习路径:从任务状态与调度器讲起,覆盖内核移植、任务管理、任务间通信,最后延伸到 Tickless 低功耗与五种堆内存管理方案。
学习路线
1 | RTOS 基础 |
内容概览
RTOS 入门与基础(第 1-2 章)
- 对比裸机编程与 RTOS 在任务调度、硬件管理和开发复杂度上的差异;
- 了解 FreeRTOS 开源、轻量级、可移植的特点;
- 认识任务的运行态、就绪态、阻塞态和挂起态,理解优先级对调度结果的影响。
内核移植与任务管理(第 3-8 章)
- 将内核源码加入 STM32 工程,配置
FreeRTOSConfig.h,修改stm32f1xx_it.c完成适配; - 掌握动态创建、静态创建和任务删除 API,理解任务函数、任务栈与任务控制块;
- 使用 API 挂起和恢复任务,观察任务在各状态间的切换;
- 理解开关中断、临界段和调度器挂起与恢复,区分中断中可调用的 API;
- 观察同优先级任务的时间片轮转,查询任务状态与运行时间统计。
任务间通信(第 10-14 章)
| 机制 | 主要用途 | 典型特点 |
|---|---|---|
| 消息队列 | 传递结构化数据 | 支持多个消息,适合生产者与消费者 |
| 二值信号量 | 事件同步 | 只有可用和不可用两种状态 |
| 计数型信号量 | 资源计数 | 可表示多个资源或累计事件 |
| 互斥信号量 | 保护共享资源 | 支持优先级继承 |
| 队列集 | 同时等待多个通信对象 | 统一管理多个队列或信号量 |
| 事件标志组 | 等待多个条件 | 通过事件位组合系统状态 |
| 任务通知 | 单任务定向通知 | 开销小、速度快 |
其中互斥量的优先级继承机制是重点:它可以降低优先级翻转带来的实时性风险,这也是互斥量与二值信号量最本质的区别。
软件定时器与系统优化(第 15-17 章)
- 区分单次定时器和周期定时器,理解定时器服务任务的调度方式;
- 配置 Tickless 模式,观察系统空闲时的低功耗行为;
- 对比
heap_1到heap_5五种内存管理方案,根据是否支持释放、内存碎片和系统需求进行选择。
动态与静态创建对比
| 方式 | 特点 | 适用场景 |
|---|---|---|
| 动态创建 | 从 FreeRTOS 堆中申请任务控制块和任务栈 | 任务数量或生命周期需要灵活变化 |
| 静态创建 | 由应用程序提供任务控制块和任务栈 | 需要确定性内存、避免运行时分配 |
学习建议
- 先理解任务状态、优先级和调度器,再开始学习通信机制;
- 先用动态方法完成任务实验,再用静态方法比较内存管理差异;
- 学习每个 API 时同时记录调用环境、阻塞行为、超时参数和中断可用性;
- 先掌握队列、二值信号量和互斥量,再学习队列集、事件组和任务通知;
- 使用任务状态查询和运行时间统计定位调度、阻塞和优先级问题。