news 2026/4/15 14:28:48

【计算机基础】-9-RT Thread的rt_list_init

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【计算机基础】-9-RT Thread的rt_list_init

下面将从定义、原理、源码、用途、典型应用场景等方面,全面、清晰地为你详解rt_list_init及其在 RT-Thread 中的“用途”。


一、rt_list_init是什么?

rt_list_initRT-Thread 实时操作系统内核中的一个基础函数(通常以宏实现),用于初始化一个双向链表节点(Node)。以便后续

函数原型:

void rt_list_init(rt_list_t *l);

其中,rt_list_t定义如下(在rtdef.h中):

struct rt_list_node { struct rt_list_node *next; struct rt_list_node *prev; }; typedef struct rt_list_node rt_list_t;

✅ 这是一个纯指针结构,没有数据域——这是典型的“侵入式链表”(Intrusive List)设计。


二、rt_list_init做了什么?(原理)

它将一个链表节点初始化为“自循环”的空链表

l->next = l; l->prev = l;

📌 为什么这样设计?

  • next == prev == 自身时,表示该链表为空
  • 插入、删除、遍历操作无需判断“是否为空”,逻辑统一、高效。
  • 这是 Linux 内核、RT-Thread、Zephyr 等嵌入式系统广泛采用的经典模式。

💡 想象一个环形跑道:起点和终点是同一个点 → 表示“没人跑”(空链表)。


三、源码实现(极简!)

在 RT-Thread 中,rt_list_init通常定义为宏(位于include/rtservice.h或类似头文件):

#define rt_list_init(l) do { \ (l)->next = (l); \ (l)->prev = (l); \ } while (0)

✅ 使用do-while(0)是为了在宏中安全支持多语句,避免语法错误。


四、rt_list_init的核心用途(“途”)

✅ 用途 1:作为链表的“头节点”初始化

当你需要创建一个空链表时,先定义一个rt_list_t head;,然后:

rt_list_init(&head); // head 成为一个空链表的头

后续可通过rt_list_insert_after()等函数插入节点。


✅ 用途 2:初始化内核对象中的链表节点(最常见!)

RT-Thread 内核大量使用rt_list_t作为对象的成员,用于组织同类对象。例如:

(1)线程控制块中的tlist
struct rt_thread { ... rt_list_t tlist; // ← 链表节点 };
  • 创建线程时:rt_list_init(&(thread->tlist));
  • 作用:让线程能被挂入就绪队列、挂起队列、延时队列等。
(2)IPC 对象(信号量、互斥锁等)的等待队列
struct rt_ipc_object { rt_list_t suspend_thread; // 等待该资源的线程链表 }; // 初始化: rt_list_init(&(ipc->suspend_thread));
(3)定时器链表
struct rt_timer { rt_list_t row[RT_TIMER_LEVEL]; // 多级链表节点 }; rt_list_init(&timer->row[i]);
(4)设备驱动中的设备列表
static rt_list_t device_list; rt_list_init(&device_list); // 所有注册设备挂在此链表

✅ 用途 3:实现高效、零开销的对象管理

  • 侵入式设计:链表节点嵌入在对象内部,无需额外内存分配
  • 快速反查宿主对象:通过rt_list_entry()宏,从链表节点地址反推整个结构体地址:
    struct rt_thread *thread = rt_list_entry(node, struct rt_thread, tlist);

🔑 这是 RT-Thread 内核高效运行的关键技术之一!


五、配套操作函数(完整链表工具箱)

函数作用
rt_list_init(l)初始化空链表
rt_list_insert_after(prev, node)prev后插入node
rt_list_insert_before(next, node)next前插入node
rt_list_remove(node)从链表中移除node
rt_list_isempty(l)判断链表是否为空(l->next == l
rt_list_entry(ptr, type, member)由节点地址反推宿主结构体指针

六、总结:rt_list_init的“途”(用途)一览

场景用途说明
内核对象初始化为线程、定时器、IPC、设备等对象的链表节点做初始“自循环”设置
构建空链表作为用户自定义链表的头节点
支持动态组织使对象能被灵活插入/移出不同链表(如就绪队列 ↔ 挂起队列)
实现高效调度调度器通过遍历就绪链表快速找到最高优先级线程
零内存开销无需额外分配链表节点,节省 RAM(对嵌入式系统至关重要)

一句话记住

rt_list_init是 RT-Thread 内核的“链表起点生成器”——它让一个节点变成一条空链表,为后续高效组织线程、资源、设备等对象奠定基础。

理解它,就理解了 RT-Thread 如何用极简代码实现强大内核功能的核心思想。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 14:32:25

LangChain十年演进

LangChain 的十年(2015–2025),是一段从“不存在”到“爆发式流行”,再到“通过 LangGraph 深度重塑 Agent 逻辑”,最后在 2025 年演进为“云原生、内核级编排的 AI 操作系统驱动程序”的激荡史。 虽然 LangChain 诞生…

作者头像 李华
网站建设 2026/4/14 16:13:15

好写作AI:再也不用“好像/可能/大概”了!学术语言变身指南

导语:每个深夜的文档前,都有个被表达“榨干”的灵魂 写论文时,你是否经历过这样的“精神分裂”?脑海里思如泉涌,指尖输出的文字却像“小学生作文”;明明数据扎实、观点新颖,写出来却总觉得“差…

作者头像 李华
网站建设 2026/4/15 6:50:56

OpenClaw(原Clawdbot)2026年部署教程:小白快速上手

OpenClaw(原Clawdbot)2026年部署教程:小白快速上手。OpenClaw是什么?2026年OpenClaw搭建简易指南。OpenClaw(原Clawdbot/Moltbot)是一个开源的AI智能体平台,凭借其强大的任务自动化能力和多工具…

作者头像 李华
网站建设 2026/4/15 6:19:23

学长亲荐!专科生必备的AI论文网站 —— 千笔写作工具

你是否曾为论文选题发愁?是否在写到一半时突然卡壳,毫无头绪?又或者反复修改却仍不满意内容质量?论文写作不仅是对知识的考验,更是对时间和耐心的挑战。对于专科生来说,时间紧、任务重,更需要一…

作者头像 李华