FreeRTOS List 研究

本文深入探讨FreeRTOS中的链表结构,它作为系统基础,实现于list.c和list.h。链表采用双向结构,xListEnd作为末尾标识。xListItem结构包含 pvOwner 和 pvContainer 字段,便于快速查找任务控制块(TCB)和链表。FreeRTOS提供了vListInitialise、vListInitialiseItem等5个核心链表操作函数,uxListRemove函数通过节点删除自身,利用pvContainer指针定位链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    FreeRTOS的链表结构是一切的基础,主要实现在list.c和list.h文件里面,是较典型的双向链表。具体数据结构参见下图:

图1  --图一

    其中,struct xLIST_ITEM 就是xListItem: typedef struct xLIST_ITEM xListItem;

    从图一中可以看出,xListEnd是作为一个哑节点而存在的,他就是为了标明链表的末尾而存在的。需注明的是 portTickType通常是一个unsigned类型的整形。

    这里xListItem结构有两个成员是FreeRTOS为方便快速由链表节点找到相应的链表和该链表节点代表的对象而定义的:pvOwner就是拥有这个节点的数据结构的指针,通常是TCB(这从下面TCB的结构中也可以看出),pvContainer指向的就是该节点所在链表的指针了。

    链表结构的典型应用就是连接FreeRTOS中的任务控制块TCB,这里将任务控制块的结构贴出方便交叉参考:

--图二

    这是一个稍微简化了的TCB。可以看到,这里面有两个xListItem结构。其中xGenericListItem这个结构成员就是要插入到上面描述的xList中的项了。

    在list.c中,FreeRTOS只定义了5个链表函数,其他的链表功能都被定义成宏。这5个函数为:

vListInitialise、 vListinitialiseItem、 vListInsertEnd、 vListInsert、 uxListRemove。

这几个函数都相当的简明。需要注意的是uxListRemove函数,他仅需以被删除的节点为参数调用即可,因为xListItem结构的pvContainer指向的就是该节点所在的链表了。

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值