跳到正文
XiaoGao 的个人博客

NO.11 · 嵌入式开发

FreeRTOS 实时操作系统:从裸机到多任务调度

FreeRTOS 实时操作系统学习笔记,覆盖任务调度、内核移植、消息队列、信号量、事件组、任务通知、软件定时器、Tickless 低功耗与内存管理。

发布 DATE
字数 WORDS
973
阅读 READ
2 分钟

裸机程序写到一定程度,总会遇到”多个任务如何同时运行”的问题。这份笔记整理 FreeRTOS 的完整学习路径:从任务状态与调度器讲起,覆盖内核移植、任务管理、任务间通信,最后延伸到 Tickless 低功耗与五种堆内存管理方案。

学习路线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
RTOS 基础
├── 裸机与 RTOS 的对比
├── FreeRTOS 特点
├── 任务调度
└── 任务状态
↓
内核移植与任务管理
├── 源码结构和系统配置
├── FreeRTOS 移植
├── 任务创建与删除
├── 任务挂起与恢复
└── 时间片调度
↓
实时系统服务
├── 中断管理
├── 时间管理
├── 消息队列
├── 信号量和互斥量
├── 队列集、事件组和任务通知
└── 软件定时器
↓
系统级优化
├── Tickless 低功耗
└── FreeRTOS 内存管理

内容概览

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 堆中申请任务控制块和任务栈 任务数量或生命周期需要灵活变化
静态创建 由应用程序提供任务控制块和任务栈 需要确定性内存、避免运行时分配

学习建议

  1. 先理解任务状态、优先级和调度器,再开始学习通信机制;
  2. 先用动态方法完成任务实验,再用静态方法比较内存管理差异;
  3. 学习每个 API 时同时记录调用环境、阻塞行为、超时参数和中断可用性;
  4. 先掌握队列、二值信号量和互斥量,再学习队列集、事件组和任务通知;
  5. 使用任务状态查询和运行时间统计定位调度、阻塞和优先级问题。

仓库

    ↑↓ 选择↵ 打开>theme · >random · >top · >archive