1. 引言
FreeRTOS 作为最流行的嵌入式实时操作系统之一,其内核源码简洁且功能完善。通过剖析其关键模块(任务管理、调度器、队列、内存管理和移植层),不仅能够更深入地理解 RTOS 的运行机制,还能掌握根据项目需求进行内核定制与优化的能力。本章将带你以 FreeRTOS 10.x 版本为例,逐层剖析源码结构与关键算法,并在每个模块中插入 PlantUML 流程图帮助可视化理解,最终展示一个精简版内核定制示例。
2. 源码组织与目录结构
FreeRTOS 源码主要分为以下目录:
FreeRTOS/
├── include/ // 公共头文件
├── Source/
│ ├── portable/ // 移植层
│ │ └── GCC/ARM_CM4F/
│ │ ├── port.c
│ │ └── portASM.s
│ ├── croutine.c // 协程支持
│ ├── event_groups.c // 事件组实现
│ ├── heap_4.c // heap_4 内存管理
│ ├── list.c // 链表操作
│ ├── queue.c // 队列实现
│ ├── tasks.c // 任务管理与调度
│ ├── timers.c // 软件定时器
└── FreeRTOSConfig.h // 用户配置
每个文件职责:
-
tasks.c:核心调度器与任务状态转换;
-
queue.c:队列与信号量的底层实现;
-
list.c:双向链表管理就绪、阻塞和延时任务;
-
heap_4.c:内存分配器;
-
port.c/portASM.s:基于 Cortex-M 架构的上下文切换与中断管理;
-
timers.c:软件定时器管理。
3. 任务管理与调度实现(tasks.c)
3.1 任务控制块(TCB)结构
/* tasks.c 中的 TCB 定义 */
typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack; // 任务堆栈指针
List_t xStateListItem; // 任务状态链表节点
Li