FreeRTOS笔记:核心概念、API用法、查找方法与避坑
danielomg22212/freertos-notes
https://github.com/danielomg22212/freertos-notes
完整版本点击链接 https://github.com/danielomg22212/freertos-notes

FreeRTOS笔记:核心概念、API用法、查找方法与避坑
这不是一份普通的 FreeRTOS 笔记,而是一份面向真实嵌入式开发场景整理的 RTOS 学习与实战手册。
它从任务调度、队列、信号量、互斥量、事件组、软件定时器、任务通知等核心机制出发,把 FreeRTOS 最常用、最容易踩坑、最值得掌握的内容系统串起来,并结合 CubeMX、CMSIS-RTOS、原生 FreeRTOS API、中断 FromISR 规则、栈/堆排查、HardFault 调试等实际开发问题进行整理。
这份笔记的目标不是让你“看过 FreeRTOS”,而是帮助你真正建立 RTOS 工程思维:知道什么时候该用任务,什么时候该用队列,什么时候该用信号量或互斥量,如何让中断和任务正确协作,如何定位任务不运行、队列收不到、栈溢出、内存不足等常见问题。
适合嵌入式初学者系统入门,也适合已经写过裸机程序、准备转向 RTOS 项目开发的同学作为长期查阅手册,由经验丰富的工程师编写。
笔记不是简单堆 API,而是按“核心概念 -> 使用场景 -> 常用函数 -> 代码示例 -> 排错思路”的方式整理,适合用于快速入门、复习回顾和实际项目开发时查阅。
本文基于原有 FreeRTOS 笔记重新整理,由danielomg22212编写,目标不是堆资料,而是帮助初学者快速建立下面几种能力:
1. 知道 FreeRTOS 各组件解决什么问题。
2. 知道任务、队列、信号量、互斥量、事件组、定时器该怎么选。
3. 看懂常用 API 的函数原型和参数。
4. 在没有 AI 帮助时,能自己查函数、查配置、查字段、查源码。
5. 避开 STM32 + CubeMX + FreeRTOS 开发中最常见的坑。
1. FreeRTOS 最核心总纲
FreeRTOS 是一个实时操作系统内核。它主要帮你解决:
多个任务如何并发运行。
任务之间如何通信。
任务之间如何同步。
共享资源如何保护。
定时任务如何执行。
中断和任务如何协作。
系统内存、栈、优先级如何管理。
最重要的对象:
| 对象 | 解决什么问题 | 常见 API |
|---|---|---|
| Task 任务 | 把程序拆成多个并发执行的函数 | xTaskCreate()、vTaskDelay() |
| Queue 队列 | 任务之间传数据 | xQueueCreate()、xQueueSend()、xQueueReceive() |
| Semaphore 信号量 | 同步事件、计数资源 | xSemaphoreGive()、xSemaphoreTake() |
| Mutex 互斥量 | 保护共享资源 | xSemaphoreCreateMutex() |
| Event Group 事件组 | 等待多个事件组合 | xEventGroupSetBits()、xEventGroupWaitBits() |
| Software Timer 软件定时器 | 延时后执行回调或周期执行回调 | xTimerCreate()、xTimerStart() |
| Task Notification 任务通知 | 轻量级任务同步/计数/事件 | xTaskNotifyGive()、ulTaskNotifyTake() |
最关键选择公式:
要并发执行一段逻辑,用 Task。
要传结构化数据,用 Queue。
只通知“发生了某件事”,优先用 Task Notification 或 Binary Semaphore。
要保护共享资源,用 Mutex。
要等待多个条件组合,用 Event Group。
要周期或延时触发轻量回调,用 Software Timer。
中断里通知任务,用 FromISR 版本 API。
2. FreeRTOS 的运行模型
2.1 任务不是进程
在 MCU 上使用 FreeRTOS 时,任务之间通常共享同一个地址空间。
这意味着:
全局变量所有任务都能访问。
多个任务同时访问同一个全局变量会产生竞争。
中断和任务同时访问同一个变量也会产生竞争。
所以原笔记里的提醒非常重要:
RTOS 下全局变量要谨慎使用。
共享变量必须考虑互斥、临界区、volatile、队列或事件同步。
常见错误:
int flag = 0;
void TaskA(void *arg)
{
while (1) {
if (flag) {
// do something
flag = 0;
}
}
}
void TaskB(void *arg)
{
flag = 1;
}
更好的做法:
任务间传数据:用 Queue。
任务间通知事件:用 Task Notification / Semaphore / Event Group。
共享外设:用 Mutex。
短时间保护变量:用 Critical Section。
2.2 任务状态
任务常见状态:
Running 正在运行
Ready 就绪,等 CPU
Blocked 阻塞,等待时间、队列、信号量、事件
Suspended 挂起,不参与调度
Deleted 删除
常见状态变化:
vTaskDelay() Running -> Blocked
xQueueReceive(... wait) Running -> Blocked
xSemaphoreTake(... wait) Running -> Blocked
vTaskSuspend() 任意状态 -> Suspended
vTaskResume() Suspended -> Ready
2.3 优先级
FreeRTOS 中:
优先级数值越大,优先级越高。
例如:
#define TASK_LOW_PRIO 1 #define TASK_MID_PRIO 3 #define TASK_HIGH_PRIO 5
调度原则:
高优先级 Ready 任务会优先运行。
同优先级任务一般按时间片轮转。
低优先级任务只有在高优先级任务阻塞或让出 CPU 时才运行。
初学者常见优先级建议:
中断后处理任务:较高优先级。
控制循环任务:中高优先级。
通信解析任务:中等优先级。
日志/显示任务:低优先级。
空闲统计/后台任务:低优先级。
3. CubeMX 配置重点
3.1 CubeMX FreeRTOS 页面
原笔记截图:CubeMX 中 FreeRTOS 的主要配置入口。
常见配置项:
| 配置项 | 作用 |
|---|---|
| Tasks and Queues | 创建任务和队列 |
| Timers and Semaphores | 创建软件定时器、信号量 |
| Mutexes | 创建互斥量 |
| Events | 创建事件组 |
| FreeRTOS Heap Usage | 查看堆使用 |
| Config Parameters | 内核参数 |
| Include Parameters | API 功能裁剪 |
| Advanced Settings | 代码生成方式 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)