contiki之list头文件

来源:互联网 发布:网络借贷的平台 编辑:程序博客网 时间:2024/04/28 21:11
contiki里有很多基础的数据结构和对应的操作函数,比如说内存管理memb,列表list 队列queuebuff等等。如果不把这些最基础的东西啃下的话,你去看上层的协议比如说ipv6 ,rpl等,那是寸步难行,根本不知道在干嘛。接下来打算把这些数据结构挨个过一遍。接下来翻list的源码吧。
/***************************list.h**********************************/
#define LIST_CONCAT2(s1, s2) s1##s2
#define LIST_CONCAT(s1, s2) LIST_CONCAT2(s1, s2)
这两个宏就是用来拼接的,待会就会看到怎么用。
#define LIST(name) \
static void *LIST_CONCAT(name,_list) = NULL; \
static list_t name = (list_t)&LIST_CONCAT(name,_list)
这个宏用来定义两个跟链表有关的指针,用一开始LIST_CONCAT宏展开的话就是
static void* name_list = NULL
static list_t name = (list_t)&name_list
这个list_t又是啥,追踪下去发现是typedef void ** list_t;也就是说定义了一个指针叫name_list,还有一个指向指针的指针name
#define LIST_STRUCT(name) \
void *LIST_CONCAT(name,_list); \
list_t name
这宏定义跟上面的很像,关键就是少了个static,看注释上也是说上面的宏定义的是模块内部使用的静态变量,这个宏定义的是全局。其实还不仅如此,我搜了一下用到这个宏的地方,在uip-ds6-route.h里有,如下
struct uip_ds6_route_neighbor_routes {
LIST_STRUCT(route_list);
};
而LIST这个宏在nbr_table.c里是这样的
LIST(nbr_table_keys);
也就是说用LIST的时候定义的是两个零散的变量,用LIST_STRUCT的时候变量是被装在一个结构体里的。好,接着往下看。
#define LIST_STRUCT_INIT(struct_ptr, name) \
do { \
(struct_ptr)->name = &((struct_ptr)->LIST_CONCAT(name,_list)); \
(struct_ptr)->LIST_CONCAT(name,_list) = NULL; \
list_init((struct_ptr)->name); \
} while(0)
这个宏呢就是用来给LIST_STRUCT宏定义的结构体初始化用的。这样看可能不是很清楚这个宏的原理,结合实例看就明白了。在uip-ds6-route.c里有如下语句
struct uip_ds6_route_neighbor_routes *routes;
LIST_STRUCT_INIT(routes, route_list);
uip_ds6_route_neighbor_routes就是包含了LIST_STRUCT的结构体类型。list_init((struct_ptr)->name)这句感觉是多余的,跟
(struct_ptr)->LIST_CONCAT(name,_list) = NULL是一样的。
接下来老规矩,就是一堆针对这个list数据结构的操作函数声明了。
void list_init(list_t list);
void * list_head(list_t list);
void * list_tail(list_t list);
void * list_pop (list_t list);
void list_push(list_t list, void *item);

void * list_chop(list_t list);

void list_add(list_t list, void *item);
void list_remove(list_t list, void *item);

int list_length(list_t list);

void list_copy(list_t dest, list_t src);

void list_insert(list_t list, void *previtem, void *newitem);

void * list_item_next(void *item);

#endif /* LIST_H_ */
你可能觉得怪怪的,这个list结构体有点空荡荡的,就一个指针还有一个指向这个指针的指针,就两个变量而已,算什么列表?别急,看了list.c就会明白,这个list的适用面很广,设计得很灵活。
原创粉丝点击