danielomg22212/freertos-noteshttps://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 的主要配置入口。

CubeMX FreeRTOS 配置入口

常见配置项:

配置项作用
Tasks and Queues创建任务和队列
Timers and Semaphores创建软件定时器、信号量
Mutexes创建互斥量
Events创建事件组
FreeRTOS Heap Usage查看堆使用
Config Parameters内核参数
Include ParametersAPI 功能裁剪
Advanced Settings代码生成方式
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐