1,链表节点数据结构
链表就是列表,链表节点就是列表项,在freertos中使用的大多是双向链表。在rtos的list.h文件下有这样一个链表节点数据结构定义:
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE
这两个是list.h定义的宏,用来检查执行情况的,一般不用(后面类似不再赘述)。
1,xItemValue为辅助值,用来帮助节点进行排序的,就是节点的序号,需要自己设置值。2,pxNext为一个指向上一个与该结构体相同的结构体指针,也就是指向上一个节点,pxPrevious就是指向下一个节点,节点通过这两个指针与其他节点就能建立成链表。3,pvOwner一个任意类型指针,指向拥有该节点的对象,(通常是TCB,任务章节会讲解TCB是什么)。4,pvContainer这个指针指向这个节点所在的链表。5,最后将ListItem_t定义为struct xLIST_ITEM数据类型,方便之后使用。
注:configLIST_VOLATILE宏定义在list.h中没有定义任何东西,所以忽略就行了,TickType_t是由configUSE_16_BIT_TICKS宏决定,在freertosconfig.h里面设置,默认为0,所以是uint32位;
于是我们就得到这样一个节点:
2,链表根节点数据结构
链表根节点数据结构在list.h中定义如下:
1,uxNumberOfItems为链表节点计数器,记录链表里面有几个节点 。2,pxIndex指向链表节点,用于遍历节点。3,xListEnd一个MiniListItem_t类型链表节点(MiniListItem_t类型下面讲解),这个节点就是链表的尾节点,但链表是首尾相连,所以也是首节点。4,最后将List_t定义为struct xLIST数据类型。
根节点的作用总结下来就是记录链表个数,通过pxIndex访问链表节点,并且使用xListEnd记录尾节点
3,链表精简节点数据结构
链表精简节点数据结构在list.h中定义如下:
1,xItemValue节点的序号。2,pxNext,pxPrevious指向上下节点指针。3,最后将该结构体类型定义为MiniListItem_t。
其实精简节点就是普通节点的一部分,作为链表尾节点。
4,链表节点的初始化
链表节点初始化在list.c中实现:
使节点没有插入任何链表
链表根节点初始化:
这个功能实现了如下功能:
让精简链表两个指针指向自己,将节点序号设置为最大以确保是尾节点(portMAX_DELAY为0xffffffff),让遍历节点指向尾节点,并且让列表数置0,注意,精简节点不算一个列表中的一个节点,只是作为一个尾巴标志;
5,节点插入和删除
插入尾部(list.c中):
将节点与精简节点(尾节点)相连同时更新节点统计数,pvContainer指向根节点,表明节点所属链表。
升序排列插入链表:
通过xItemValue以及利用for循环查找所属位置并插入,如果和尾节点序号一样,则 插在尾节点前面,同时更新节点统计数,pvContainer指向根节点,表明节点所属链表。
链表删除:
传入想要删除节点,查找其所属链表,移除即可;同时节点统计数减1;
链表节点插入实验
实验成功。