RT-Thread内核对象初始化链表组织方式
【资料图】
背景
最近在看RT-Thread内核的源码,内核对象使用链表组织。RT-Thread内部有完整的【双向链表】与【单向链表】的操作API与实际用例内核对象,内核派生的如线程、定时器、设备等,都是由链表链起来管理的。链表介绍
/** * Double List structure */struct rt_list_node{ struct rt_list_node *next; /**< point to next node. */ struct rt_list_node *prev; /**< point to prev node. */};typedef struct rt_list_node rt_list_t; /**< Type for lists. */
链表是一种数据结构,跟其他的结构体类似,初始化后,本身占用内存空间,自身有内存地址。一般双向链表,内部的成员,是链表本身结构体的指针,注意,指针的指向,初始化后,并没有确定。RT-Thread 的双向链表,初始化时,内部的指针,指向自己本身的地址,也就是给链表的成员,赋好了初值(指针内容,一般是地址)。链表使用,节点一般都是【全局结构体变量】,全局静态初始化,或动态内存申请(全局)。不用全局的链表节点,注意不要链入链表结构,否则节点地址因为【生命周期】结束内存释放了,地址就不对了,就无法管理各个链表的节点了。双向链表API
这里主要提一下链表节点的插入【次序】,因为遇到了一点小困惑,所以深入的研究了下。理解:【最新节点】【前一个节点】【最早节点】链表的头的问题:内核对象使用【对象容器】,全局的,对象初始化后,用了 rt_list_insert_after/* 来自:object.c :rt_object_init */ /* insert object into information object list */ rt_list_insert_after(&(information- >object_list), &(object- >list));
注意,rt_list_insert_after,插入的位置,【不是链表的尾部插入,是第一个链表节点【第一个参数】的后面。】也就是说,如果创建了3个内核对象,默认的排序如下:不是:【容器head】 --- [obj1] --- [obj2] --- [obj2] 而是:【容器head】 --- [obj3] --- [obj2] --- [obj1]
如果把链表插入到【尾部】后面,就要先把链表指针移到尾部,再执行:rt_list_insert_after.查看内核对象
其实,thread,device等对象,都是内核对象【派生】出来的。RT-Thread 提供list_thread、list_device等,查看内核的对象。查看线程初始化【次序】,看看最后打印的线程,就是【最先】首个创建的线程。一般从链表【头部】开始遍历各个链表节点。如下:最后一个节点是:main线程.其实,main线程,是第一个创建的。msh / >list_threadthread pri status sp stack size max used left tick error-------- --- ------- ---------- ---------- ------ ---------- ---persim 16 suspend 0x000001ec 0x0000c000 08% 0x00000003 000sens 28 suspend 0x000000d8 0x00001000 13% 0x00000019 000hws 28 suspend 0x000000d8 0x00000800 10% 0x00000032 000dcm_tpo 10 suspend 0x00000090 0x00000800 14% 0x00000004 000dcm_tpo 10 suspend 0x00000090 0x00000800 14% 0x00000002 000dcm_tpo 10 suspend 0x00000090 0x00000800 15% 0x00000004 000tshell 20 running 0x000001fc 0x00001000 26% 0x0000000a 000touch 16 suspend 0x00000098 0x00000800 18% 0x00000013 000usbd 8 suspend 0x000000ac 0x00001000 04% 0x00000014 000at_clnt 9 suspend 0x000000c0 0x00000600 12% 0x00000002 000ulog_asy 30 suspend 0x00000084 0x00000c00 09% 0x00000006 000mmcsd_de 22 suspend 0x000000a0 0x00000400 48% 0x00000014 000alarmsvc 10 suspend 0x000000a8 0x00000800 27% 0x00000003 000rils 12 suspend 0x000000b0 0x00000800 08% 0x0000001e 000tidle0 31 ready 0x00000058 0x00000800 04% 0x0000001d 000timer 4 suspend 0x00000074 0x00000800 08% 0x00000009 000main 10 suspend 0x00000120 0x00000800 41% 0x00000012 000 /* 最先创建的线程,最后打印 */
内核对象初始化的链表【次序】:总结
使用链表时,注意插入的次序,尤其是FIFO的缓冲区的读写处理熟悉RT-Thread 内核对象,对象管理方法。深入研究基本数据结构的使用:链表关键词:
责任编辑:meirong
-
RT-Thread内核对象初始化链表组织方式
-
【新要闻】B站Q1财报:营收持平、月活下降,前路依旧迷茫
-
中央网信办:严厉打击雇佣网络水军对企业进行诋毁、抹黑等行为
-
一次发酵法诀窍
-
通灵股份6月2日快速上涨
-
云南彝良暴雨引发山洪 致3人死亡1人失联
-
新冠“乙类乙管”后首次高考,多地明确高考生自主决定是否戴口罩
-
银行理财公司密集调研 关注板块轮动机会
-
【独家焦点】新加坡《海峡时报》:互联网时代,也别否定祖母的智慧
-
马鞍山市建立节约用水工作协调机制
-
“夜经济”催生中国消费新“夜”态 焦点快看
-
每日观点:建信基金管理有限责任公司关于新增邮储银行为公司旗下部分开放式基金代销机构的公告
-
热点评!赛博朋克2077怎么跳过启动器 赛博朋克2077怎么跳过启动器进入
-
全球资讯:追星族乐队演出(追星族乐队)
-
全球热点!该还款方式转入他行卡金额已达上限是什么意思
-
热门:艺人统筹是什么工作_艺人统筹
-
劲舞团房间名怎么打的_劲舞个性房名_环球新视野
-
让豋网_让登网_世界新要闻
-
长沙火车站在哪里_长沙火车站
-
资讯推荐:101009988是什么电话_10100998什么电话
-
佰维存储:公司产品未涉及ChatGPT等人工智能领域 环球今头条
-
【全球快播报】Yiwealth SMI|东财当选“热点大神”,中信证券荣膺“高评王”
-
天天视讯!First Mode 使用 ABB 电池制造 FC 自卸卡车
-
环球快消息!《瞬息全宇宙》幕后技术公司获谷歌支持
-
火影博人传63集和64集预告:异界空间大战,佐助使用最强杀手锏 世界报道
-
全球视点!david数据库go富集分析(david数据库)
-
商务部:中国多地都在主动对接DEPA
-
品牌电商投资三大原则:避免FOMO 因地制宜 长效平衡 全球时讯
-
每日观点:售价20.99万起 smart精灵#3正式上市
-
全球聚焦:word改成pdf格式怎么改(word改成pdf格式)
-
“Z世代”唱享中国丨弄堂旧梦,九子拾遗|关注
-
母女在幼儿园门口被撞身亡,当天幼儿园正常开园,但六一活动被取消_环球热头条
-
微博半年可见怎么设置
-
每日视讯:新浪彩票专家郭哥北单推荐:老男孩客战不败
-
观速讯丨2023年中山市第二中学艺术生招生方案