LiteOS之双向链表

来源:互联网 发布:可可验证9.5源码 编辑:程序博客网 时间:2024/06/15 05:03
LiteOS中的双向链表和linux中的实现相差不大。一直很难理解为什么liteOS系统中会出现类似a.h, a.inc, a.ph的头文件,为了避免采用相同后缀会出现重名。采用不同后缀而文件名相同的好处是啥呢?
链表结构定义
节点的结构定义
typedef struct LOS_DL_LIST{    struct LOS_DL_LIST *pstPrev;            /**< Current node's pointer to the previous node*/    struct LOS_DL_LIST *pstNext;            /**< Current node's pointer to the next node*/} LOS_DL_LIST;
在链表初始化的头节点中前后的节点指针指向其本身,同时以此作为判断链表是否为空的依据。
用户使用如何定义结构方式
typedef struct USR_LIST_DEFINE{    ... //定义其他元素    LOS_DL_LIST usrListNode;         ...//定义其他元素} USR_LIST_DEFINE;
关于node和entry概念
简单的讲用户定义的结构地址为entry地址,而此结构中的LOS_DL_LIST占用地址为node地址。链表连接维护的地址为node地址,具体如下图,绿色为USR_LIST_DFINE结构体。

链表的操作
链表的操作包括初始化、元素的增加、删除、状态判断、元素获取及遍历等等。在使用LiteOS的链表接口进行链表操作时,链表中存储的信息均为node的地址信息。而当访问用户定义的机构时,需要进行地址的转换,即需要从node的地址转换为ENTRY地址。在liteOS的接口中已经提供了ENTRY地址转换的相关接口,看看具体的实现方式。
实现代码如下:
#define LOS_OFF_SET_OF(type, member) ((long)&((type *)0)->member)#define LOS_DL_LIST_ENTRY(item, type, member)  ((type *)((char *)item - LOS_OFF_SET_OF(type, member)))
首先得到然后得到偏移值offset,然后从Node的地址减去offset得到相应的Entry地址。