FreeRTOS列表与列表项详细讲解

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;

链表节点插入实验


 

 

实验成功。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值