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          |
+---------------------------+

主要模块:

  1. Task(任务)

  2. Scheduler(调度器)

  3. Queue(队列)

  4. Semaphore(信号量)

  5. Mutex(互斥锁)

  6. Timer(软件定时器)

  7. 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 个问题

很多嵌入式面试都会问这些。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐