⚠️ 声明:本文作者也是 FreeRTOS 初学者,这篇文章只是我在学习源码过程中的一些理解与记录,难免存在理解偏差,欢迎交流与指正(有不少ai辅助写的地方,因为很多地方感觉自己确实说不清楚)


一、为什么要看 list.c?

刚开始看 FreeRTOS,我也和很多人一样:

👉 直接冲 task.c,觉得“调度才是核心”。

结果看着看着就开始怀疑人生:

  • 为什么任务切换要这么写?

  • 为什么到处都是链表?

  • 为什么逻辑这么绕?

后来才发现:

不是调度复杂,而是我没看懂它背后的数据结构 —— list.c


二、先用一张图理解它到底是什么

📌 FreeRTOS 链表结构示意

👉 关键点:

  • 一个双向链表

  • 有一个特殊节点:xListEnd(哨兵)

  • 所有节点形成闭环(不是 NULL 结束)


三、结合源码看初始化

来看源码里的初始化代码:

🧠 用“排队”理解这段代码:

初始化之后其实是这样:

[ xListEnd ] → 自己 → 自己

👉 相当于:

🚧 队伍里先站了一个“虚拟的人”,还没有真实任务

好处:

  • 永远不用判断 NULL

  • 空链表也能统一处理


四、核心机制 + 例子(重点)


1️⃣ 有序插入:任务不是随便排,而是“按时间排”

源码核心:

 📌 图示:延时任务链表

🍔 生活例子:

你去奶茶店预约:

取单时间
小明 10:00
小刚 10:02
小红 10:05

链表自动变成:

xListEnd → 小明 → 小刚 → 小红 → xListEnd

否则可能会是小刚小明小红等其他任意顺序

👉 系统只需要看:

链表第一个人 = 最早该执行的任务


2️⃣ Tick 检查:为什么只看“第一个节点”?

源码逻辑(调度中会用):

if( listGET_ITEM_VALUE_OF_HEAD_ENTRY(...) <= xTickCount )

📌 图示:时间推进

🧠 直觉理解:

现在时间 = 10:01

队伍:小明(10:00) → 小刚(10:02) → 小红(10:05)

👉 只需要看:

  • 小明:到了 ✅ → 唤醒

  • 小刚:不用看 ❌(后面更晚)

💡 关键结论:

排序链表让调度从 O(n) → O(1)


3️⃣ pxIndex:实现“轮流执行”(非常容易忽略)

源码:

pxList->pxIndex

📌 图示:时间片轮转

🍔 生活例子:

三个同优先级任务:

小明 → 小红 → 小刚

如果每次从头选:

👉 小明永远先执行 ❌

FreeRTOS 做法:

👉 记住上次执行位置(pxIndex)

     当被抢占调度以后可以找到正确的节点

执行顺序:

小明 → 小红 → 小刚 → 小明 → ...

💡 这就是:

时间片轮转(公平调度)


4️⃣ O(1) 删除:为什么实时系统必须这样?

源码:

📌 图示:节点删除

🧠 生活理解:

队伍中一个人离开:

  • 不需要重排队

  • 直接把前后人连起来

💡 意义:

删除操作是 O(1),不会拖慢系统响应


五、结合调度流程再看一遍(串起来)

🧩 任务延时

vTaskDelay(100);

👉 插入延时链表(按时间排序)


🧩 Tick 到来

👉 只检查链表头


🧩 到时间

👉 从延时链表删除 → 插入就绪链表


🧩 调度执行

👉 pxIndex 实现轮转


六、初学者最容易误解的点(配例子)

❗ xItemValue 不是“优先级”

  • 延时链表:表示“时间”

  • 就绪链表:几乎不用它

👉 它是“排序依据”,不是“重要性”


❗ 一个任务不能在两个链表里

因为:

pvContainer

👉 一个节点只能属于一个链表

所以:

一个任务有多个 ListItem(不同用途)


七、为什么说它是“地基”?

一句更直白的话:

FreeRTOS 调度 ≈ 链表操作(插入 + 删除 + 遍历)

你在 task.c 看到的复杂逻辑,本质都是:

👉 对 list.c 的调用


八、我目前的理解(初学者视角)

我现在的一个感受是:

FreeRTOS 并没有用复杂算法,而是把“数据结构设计”做到极致。

list.c:

  • 代码不多

  • 但影响全局

👉 真正的“低调大佬模块”


九、结尾

如果你正在看 FreeRTOS 源码,我非常建议:

👉 一定要把 list.c 搞懂,再看 task.c

否则会一直“看懂代码但不理解设计”。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐