当前位置: 首页 > news >正文

【计算机基础】-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 如何用极简代码实现强大内核功能的核心思想。

http://www.jsqmd.com/news/369580/

相关文章:

  • 必收藏|AI席卷编程圈!程序员必看,小白入门也能读懂的职业破局指南
  • 密码学实战:crypto加解密与Hash函数的应用指南
  • 有保障的医疗器械第三方机构:安全合规+值得信赖,筑牢产品品质防线! - 速递信息
  • 2026真空烧结炉选购指南:盘点国内优质生产厂家与品牌 - 品牌推荐大师
  • 把Hadoop,zookeeper,HBASE安装完毕后面关闭虚拟机,slave2的IP地址变了,如何解决?
  • 2025西南地区金丝楠木苗木基地TOP5榜单:核心竞争力全解析与选购指南 - 深度智识库
  • 2.11
  • 2026年铸钢件生产厂家实力推荐:河南新腾飞铸钢有限公司,大型铸钢件定制加工优选 - 品牌推荐官
  • C语言课程设计选题指南:难度把控与实践项目推荐
  • 2026年全国除草剂哪家专业?核心生产能力拆解及适配建议 实用选型参考 - 深度智识库
  • 2026Q1管城区二七区装修公司排行榜|适配中原区/金水区/上街区/惠济区/郑东新区/经开区/港区老房翻新,新房装修、别墅装修 - 品牌智鉴榜
  • 2026年重庆水溶肥哪家做得好?数字化赋能 多家高适配厂家全景解析 - 深度智识库
  • poll和epoll区别及用法详解,提升服务器性能
  • 好写作AI:查重率从38.7%到3.2%!我的论文“渡劫”全记录
  • A.每日一题——108. 将有序数组转换为二叉搜索树
  • 2026济宁装修公司推荐:安逸装饰设计工程有限公司,新房/别墅/办公室装修全系服务 - 品牌推荐官
  • 好写作AI:再也不用“好像/可能/大概”了!学术语言变身指南
  • 好写作AI:别让丑图表毁了你的好数据!AI加持的学术颜值改造计划
  • 国内金丝楠木优质供应商名录:破解行业痛点的五大标杆基地 - 深度智识库
  • calloc和malloc区别,哪个快?
  • 分析无锡苏州团体服生产商,靠谱的品牌有哪些 - 工业品牌热点
  • 计算主业+斜杠收益与风险,证明组合收入远超单一稳定工作。
  • 2026年HDPE给水管厂家推荐:贵州狮诚管业科技全系产品助力农村改造与农田灌溉 - 品牌推荐官
  • 2026智享卫浴:智能马桶深度选购指南与核心数智技术解析 - 资讯焦点
  • JS中typeof如何检测函数?typeof function详解
  • C语言程序设计杨忠宝适合零基础吗?高效学习方法分享
  • 2026年墙面/局部/老房/卫生间/二手房翻新厂家推荐:靓滔装饰专业焕新服务 - 品牌推荐官
  • 2026年GEO优化服务商推荐榜单:精准匹配你的业务增长需求 - 资讯焦点
  • 实验室污气导吸装置选购指南:从0到1建立科学决策框架 - 速递信息
  • 2026年冻干机厂家实力推荐:郑州科旺达生物仪器,全系冻干设备覆盖科研/食品/医药领域 - 品牌推荐官