news 2026/4/23 13:18:09

【计算机基础】-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/21 17:12:49

移动端三大存储风险:加密数据库、KeyChain与SharedPreferences泄露攻防实战

前言 技术背景:在移动应用攻防体系中,客户端本地数据存储是攻击者信息收集阶段的核心目标。一旦用户凭证、个人信息、会话令牌等敏感数据被不当存储,攻击者便可能绕过复杂的服务器端防御,直接从最薄弱的环节——客户端——窃取关键…

作者头像 李华
网站建设 2026/4/23 13:01:32

AutoGPT十年演进

AutoGPT 的“十年”演进(2015–2025),是一段从“强化学习沙盒”到“2023 年的全球狂热”,再到 2025 年演进为“具备工业级鲁棒性、内核级安全约束的自主数字劳动力”的跨越史。 虽然 AutoGPT 项目诞生于 2023 年 3 月,…

作者头像 李华
网站建设 2026/4/18 12:08:22

【2026】 LLM 大模型系统学习指南 (59)

大型语言模型在「想」什么呢?—— 浅谈大型语言模型的可解释性大型语言模型(LLM)能完成代码生成、指令理解、文本创作等复杂任务,却始终像一个 “黑箱”:我们能看到输入和输出,却难以知晓模型从输入到输出的…

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

国家级能源基建遇袭——Qilin勒索攻击的技术拆解与防御启示

关键信息基础设施,是现代国家运转的“数字大动脉”。能源领域作为其中最核心、最敏感、最不可中断的一环,早已成为国家级网络威胁、勒索组织与网络战力量重点瞄准的目标。近年来,全球范围内针对电网、油气管道、炼化厂、水利枢纽的网络攻击呈…

作者头像 李华
网站建设 2026/4/23 11:21:54

简易浏览器-Android studio软件源代码-java语言

简易浏览器 App 简介与使用说明 一、软件简介 📱 软件定位 本软件是一款基于 Android 系统的轻量级网页浏览器,以简洁易用为核心设计理念,为用户提供快速、流畅的网页浏览体验,同时兼顾基础的导航与分享功能。核心功能 基础浏览&…

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

Java编译错误找不到符号怎么办?原因和解决方法

“错误找不到符号”是Java等编程语言编译时最常见的错误之一,尤其对初学者来说,它像一堵墙挡在学习和实践之间。它本质是编译器无法识别你代码中使用的某个名称,这背后涉及的是编程语言最基本的规则:一切标识符都必须先声明后使用…

作者头像 李华