Skip to content

FreeRTOS 深入理解

这一章解决的是“一个小设备怎样同时看按钮、控灯、联网、保存数据,而不是顾此失彼”。

ESP-IDF 应用运行在 FreeRTOS 之上。你写的 app_main 本身就是一个任务。理解 RTOS 的关键不是背 API,而是理解“多个事情如何共享一个 CPU”。可以把它想成小店里的分工:有人看门、有人收银、有人备货,任务之间要排队传话。

直觉

没有 RTOS 时,程序常常写成一个巨大的 while (1)。当读取外设、刷新显示、处理网络和保存配置的节奏不同,大循环会越来越难维护。任务的价值是把不同节奏的工作拆开。

准备工作

先确保你已经能独立运行一个外设例程。FreeRTOS 本章不引入新硬件,只用按键和 LED 观察任务之间如何传递消息。

最小例程

对应工程:examples/freertos_queue

c
typedef struct {
    int button_level;
    int64_t timestamp_ms;
} app_event_t;

按键任务向队列发送事件,LED 任务从队列取事件并改变状态。队列让程序从“谁改了这个全局变量”变成“谁发送了这个消息”。

常见错误

任务不是越多越好。每个任务都需要栈空间,优先级也会影响调度。互斥锁只保护共享资源,不要把长时间网络请求放在互斥锁里面。

官方资料

本章提示词

请帮我把一个 ESP32 外设 demo 改造成 FreeRTOS 结构:说明任务划分、优先级、栈大小、队列消息、互斥锁使用场景和阻塞风险,并给出如何用串口日志验证任务之间的数据流。

本教程使用中文编写,代码和命令保留必要英文。