[FreeRTOS]1.FreeRTOS基础知识
FreeRTOS基础知识
一、什么是 FreeRTOS
FreeRTOS(Free Real-Time Operating System)是一个轻量级、开源的实时操作系统内核,广泛用于嵌入式系统开发中。它提供了多任务调度、任务通信、时间管理、内存管理等常用操作系统功能。
- 开源免费:MIT License,商业可用
- 高度可移植:支持 STM32、ESP32、ARM Cortex-M、RISC-V 等数百种芯片
- 体积小、效率高:内核代码几千行,适用于资源受限的系统
二、FreeRTOS 架构简述
FreeRTOS 是一个抢占式内核(支持可配置为协作式),由如下核心组件组成:
- 任务(Task):最小的执行单位,相当于传统操作系统中的线程
- 调度器(Scheduler):决定哪个任务运行,负责任务切换
- 中断管理(Interrupt Management):FreeRTOS 本身不屏蔽中断,但要求 ISR 内不要调用阻塞型 API
- 时间管理(Tick):使用定时器中断(SysTick),每个 Tick 触发一次调度判断
- 任务通信机制:
- 队列(Queue)
- 信号量(Semaphore)
- 互斥锁(Mutex)
- 事件组(Event Group)
- 内存管理:提供几种内存分配器(heap_1~5),常用的是 heap_4.c
三、任务(Task)的核心概念
1. 任务的生命周期
创建 -> 就绪态 -> 运行态 -> 阻塞态/挂起态 -> 删除
2. 任务优先级
- 数字越大优先级越高
- 同优先级任务采用时间片轮转(需启用 configUSE_TIME_SLICING)
3. 任务函数结构
void Task1(void *pvParameters)
{while (1){// 任务执行代码vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时1秒}
}
4. 创建任务示例
xTaskCreate(Task1, // 任务函数"Task1", // 名称128, // 堆栈大小(单位:字)NULL, // 参数2, // 优先级NULL // 任务句柄
);
四、FreeRTOS 的调度机制
-
抢占式调度
- 当前运行任务被高优先级任务打断
- 配置:
#define configUSE_PREEMPTION 1
-
时间片调度
- 同优先级任务轮流运行
- 配置:
#define configUSE_TIME_SLICING 1
-
调度器启动
vTaskStartScheduler(); // 启动调度器,正式开始任务调度
五、系统 Tick 与时间管理
- 每个 Tick(通常是 1ms)会触发一次调度器检查是否需要切换任务
- 用 vTaskDelay() 让任务延时
vTaskDelay(1000 / portTICK_PERIOD_MS); // 延时 1000ms
六、任务之间的通信机制简介
机制 | 用途 | 特点 |
---|---|---|
队列 Queue | 数据传输 | 线程安全 FIFO |
信号量 Semaphore | 同步/互斥 | 二值/计数 |
互斥锁 Mutex | 资源保护 | 支持优先级继承 |
事件组 EventGroup | 多事件同步 | 位操作,适合状态同步 |
七、内存管理策略
模式 | 特点 |
---|---|
heap_1 | 简单线性分配,无法释放 |
heap_2 | 支持释放,简单 |
heap_3 | 使用 malloc/free |
heap_4 | 空间管理复杂,碎片少,推荐 |
heap_5 | 支持多个区域 |
配置方式(FreeRTOSConfig.h):
#define configFRTOS_MEMORY_SCHEME 4
八、示意图:FreeRTOS运行模型
九、实际工程中常见错误和建议
问题 | 可能原因 | 建议 |
---|---|---|
任务不运行 | 没有启动调度器 | 检查 vTaskStartScheduler() |
系统死机 | 堆栈溢出 | 开启 configCHECK_FOR_STACK_OVERFLOW |
ISR中调用阻塞API | 非法操作 | ISR内使用 FromISR 后缀函数 |
十、小结
FreeRTOS 的基础核心在于:
- 多任务调度
- 任务创建与优先级管理
- Tick 时间管理
- 各类通信与同步机制