FreeRTOS 是一个 轻量级实时操作系统(RTOS, Real-Time Operating System)内核
FreeRTOS 是一个 轻量级实时操作系统(RTOS, Real-Time Operating System)内核,主要用于 嵌入式系统和微控制器(MCU),例如 ARM Cortex-M、ESP32、STM32、Arduino 等。它的特点是 体积小、实时性强、可移植性高、开源免费,因此在 IoT、工业控制、机器人、智能设备等领域被广泛使用。
下面我从 概念 → 架构 → 核心机制 → 调度 → 同步通信 → 内存管理 → 实际应用 来详细解释。
一、什么是 FreeRTOS
FreeRTOS 是一个 实时操作系统内核(Kernel)。
它主要解决的问题是:
在一个单片机上同时运行多个任务,并保证关键任务能够按时执行。
如果没有 RTOS,程序通常是这样:
while(1)
{
read_sensor();
process_data();
send_uart();
}
问题:
-
任务必须按顺序执行
-
某个任务耗时会阻塞其他任务
-
难以实现实时控制
使用 FreeRTOS 后:
任务1:读取传感器
任务2:通信
任务3:控制算法
任务4:显示
这些任务 看起来同时运行。
实际上 MCU 只有一个 CPU,FreeRTOS 通过 任务调度(Task Scheduling) 快速切换任务。
二、FreeRTOS 的整体架构
FreeRTOS 的核心组件非常简单:
+---------------------------+
| Application |
| Tasks / Timers / Queues |
+---------------------------+
| FreeRTOS Kernel |
| Scheduler / IPC / Memory |
+---------------------------+
| Hardware |
| MCU / CPU |
+---------------------------+
主要模块:
-
Task(任务)
-
Scheduler(调度器)
-
Queue(队列)
-
Semaphore(信号量)
-
Mutex(互斥锁)
-
Timer(软件定时器)
-
Memory Management(内存管理)
三、任务(Task)
在 FreeRTOS 中,任务就是一个独立运行的函数。
例如:
void LedTask(void *pvParameters)
{
while(1)
{
toggle_led();
vTaskDelay(500);
}
}
创建任务:
xTaskCreate(
LedTask, // 任务函数
"LED", // 任务名字
128, // 栈大小
NULL, // 参数
1, // 优先级
NULL // 任务句柄
);
任务特点:
-
每个任务有 自己的栈
-
每个任务有 优先级
-
可以 挂起 / 恢复 / 删除
四、任务状态(Task States)
FreeRTOS 中任务有 5种状态:
+--------+
|Running |
+--------+
|
v
+--------+ +-------+ +---------+
|Ready | |Blocked| |Suspended|
+--------+ +-------+ +---------+
^
|
+------+
|Deleted|
+------+
解释:
1 Running
当前正在执行的任务。
2 Ready
准备运行,但 CPU 正在执行更高优先级任务。
3 Blocked
任务等待:
-
delay
-
queue
-
semaphore
-
event
例如:
vTaskDelay(1000);
4 Suspended
任务被手动挂起:
vTaskSuspend()
5 Deleted
任务被删除:
vTaskDelete()
五、任务调度(Scheduler)
FreeRTOS 使用 优先级抢占调度(Preemptive Scheduling)。
核心规则:
1 优先级高的任务先执行
Task A priority = 3
Task B priority = 1
Task A 会优先运行。
2 同优先级时间片轮转
如果优先级相同:
Task1 priority 2
Task2 priority 2
Task3 priority 2
调度方式:
Task1 -> Task2 -> Task3 -> Task1
3 高优先级任务可以抢占
如果低优先级任务运行时:
Task1 priority 1 (running)
Task2 priority 3 (ready)
Task2 立刻抢占 CPU。
六、任务通信(IPC)
任务之间需要通信。
FreeRTOS 提供:
Queue
Semaphore
Mutex
Event Group
Stream Buffer
七、队列(Queue)
最常用的通信方式。
特点:
-
线程安全
-
FIFO
-
支持阻塞
示例:
发送数据:
xQueueSend(queue, &data, portMAX_DELAY);
接收数据:
xQueueReceive(queue, &data, portMAX_DELAY);
使用场景:
传感器任务 -> 队列 -> 控制任务
八、信号量(Semaphore)
信号量用于 同步任务。
两种类型:
1 Binary Semaphore(二值信号量)
只有 0 或 1。
常用于:
中断 -> 任务
例如:
ISR:
xSemaphoreGiveFromISR()
Task:
xSemaphoreTake()
2 Counting Semaphore(计数信号量)
可以有多个资源。
例如:
3个资源
九、互斥锁(Mutex)
Mutex 用于 保护共享资源。
例如:
多个任务访问 UART:
Task1 -> UART
Task2 -> UART
Task3 -> UART
如果不加锁:
数据混乱
使用:
xSemaphoreTake(mutex)
使用资源
xSemaphoreGive(mutex)
FreeRTOS Mutex 支持:
优先级继承(Priority Inheritance)
防止:
Priority Inversion
十、软件定时器(Software Timer)
FreeRTOS 提供 软件定时器。
例如:
xTimerCreate()
定时执行函数:
1秒执行一次
优点:
-
不占用硬件定时器
-
统一管理
十一、内存管理
FreeRTOS 提供 5种内存管理方案:
heap_1
heap_2
heap_3
heap_4
heap_5
最常用:
heap_4
特点:
-
支持 malloc
-
支持 free
-
防止碎片
十二、Tick(系统节拍)
FreeRTOS 通过 系统时钟 Tick 实现调度。
例如:
configTICK_RATE_HZ = 1000
表示:
1ms 一个 tick
Tick 作用:
-
任务延时
-
定时器
-
调度
Tick 由 硬件定时器中断 产生。
十三、FreeRTOS 的优势
优点:
1 体积小
内核:
约 5KB ~ 15KB
2 可移植性强
支持:
ARM
RISC-V
ESP32
AVR
MSP430
3 实时性强
抢占式调度。
4 开源
MIT License。
十四、FreeRTOS 在实际项目中的结构
一个典型项目:
main()
├── 创建任务
│
├── TaskSensor
├── TaskControl
├── TaskCommunication
├── TaskDisplay
│
└── vTaskStartScheduler()
运行流程:
main
↓
创建任务
↓
启动调度器
↓
任务并发运行
十五、FreeRTOS 典型应用
应用领域:
1 物联网设备
例如:
ESP32
WiFi
MQTT
2 工业控制
PLC
机器人
电机控制
3 消费电子
智能家居
穿戴设备
智能音箱
4 汽车电子
车载控制
电池管理
十六、FreeRTOS 与 Linux 的区别
| 特性 | FreeRTOS | Linux |
|---|---|---|
| 类型 | RTOS | 通用 OS |
| 内核大小 | KB级 | MB级 |
| 是否实时 | 强实时 | 非实时 |
| 运行设备 | MCU | CPU |
| 资源需求 | 很低 | 很高 |
十七、一句话理解 FreeRTOS
FreeRTOS = 在单片机上实现多任务实时调度的微型操作系统内核。
如果你愿意,我可以继续给你讲更深入的内容,比如:
-
FreeRTOS 任务调度源码解析(非常核心)
-
FreeRTOS 上下文切换原理
-
FreeRTOS Tick 中断工作机制
-
FreeRTOS 在 STM32 / ESP32 的完整项目结构
这些是 嵌入式工程师面试和实际开发最重要的部分。
FreeRTOS 的 最低运行配置要求(Minimum System Requirements) 非常低,这也是它在嵌入式系统中广泛使用的重要原因。一般来说,只要是 带有几十 KB Flash 和几 KB RAM 的 MCU 就可以运行 FreeRTOS。下面从 CPU、RAM、Flash、定时器、编译环境等方面详细说明。
一、CPU(处理器)要求
FreeRTOS 可以运行在 8 位、16 位、32 位 MCU 上。
常见支持架构:
-
ARM Cortex-M(M0 / M3 / M4 / M7 / M33)
-
RISC-V
-
AVR
-
MSP430
-
PIC24 / dsPIC
-
Xtensa(ESP32)
最低要求:
-
支持 C 语言编译
-
支持 中断机制
-
有 堆栈指针
在 ARM Cortex-M 上通常还会使用:
-
SysTick 定时器(用于 RTOS tick)
二、Flash(程序存储)要求
FreeRTOS 内核非常小。
典型大小:
| 组件 | Flash占用 |
|---|---|
| FreeRTOS Kernel | 6KB – 10KB |
| Queue / Semaphore | 1KB – 3KB |
| Timer | 1KB |
最低配置:
Flash ≥ 16 KB
实际项目建议:
Flash ≥ 32 KB
例如:
-
STM32F030(32KB Flash) ✔
-
ATmega328(32KB Flash) ✔
三、RAM(运行内存)要求
RAM 主要用于:
-
任务栈
-
队列
-
内核数据结构
-
Heap
最低运行:
RAM ≥ 4 KB
但非常紧张。
更合理:
RAM ≥ 8 KB
推荐:
RAM ≥ 16 KB
举例:
| MCU | RAM | 是否适合 |
|---|---|---|
| STM32F030 | 4KB | 勉强 |
| STM32F103 | 20KB | 很合适 |
| ESP32 | 520KB | 非常充足 |
四、系统 Tick 定时器要求
FreeRTOS 需要 一个周期定时中断 作为系统时钟。
通常:
Tick Frequency = 100Hz – 1000Hz
例如:
configTICK_RATE_HZ = 1000
表示:
1ms 一个 Tick
常见实现:
-
ARM Cortex-M:SysTick
-
AVR:Timer0
-
RISC-V:Machine Timer
五、堆(Heap)要求
FreeRTOS 使用 heap_x.c 进行动态内存管理。
最低:
Heap ≥ 1KB
典型:
Heap ≥ 4KB
配置:
#define configTOTAL_HEAP_SIZE (4 * 1024)
六、任务栈要求
每个任务需要 独立栈空间。
最小:
Stack = 128 words
(ARM Cortex-M 上 1 word = 4 bytes)
所以:
128 × 4 = 512 bytes
如果有 3 个任务:
512 × 3 = 1536 bytes
七、最低系统示例
一个最小 FreeRTOS 系统:
MCU: Cortex-M0
Flash: 16 KB
RAM: 4 KB
Tick: SysTick 1ms
Tasks: 2
Heap: 1 KB
任务:
Task1: LED
Task2: UART
八、FreeRTOS 官方推荐最低配置
官方建议:
| 资源 | 最低 |
|---|---|
| Flash | 16 KB |
| RAM | 4 KB |
| Tasks | 1 – 3 |
| Tick | 100Hz – 1kHz |
九、典型开发板配置
常见 MCU 与 FreeRTOS:
| MCU | Flash | RAM |
|---|---|---|
| STM32F103C8 | 64KB | 20KB |
| STM32F407 | 1MB | 192KB |
| ESP32 | 4MB | 520KB |
| ATSAMD21 | 256KB | 32KB |
这些都远高于最低要求。
十、一句话总结
FreeRTOS 最低运行配置
CPU:支持中断的 MCU
Flash:≥16 KB
RAM:≥4 KB
Timer:1个周期定时器
Heap:≥1 KB
如果你是做 嵌入式开发 / STM32 / ESP32,我还可以给你整理:
1️⃣ FreeRTOS 最小工程结构(main + config + tasks)
2️⃣ FreeRTOS 启动流程(从 reset 到 scheduler)
3️⃣ FreeRTOS 内核源码结构图(非常重要)
4️⃣ FreeRTOS 面试最常问 20 个问题
很多嵌入式面试都会问这些。
更多推荐


所有评论(0)