FeeRTOS 第四章 列表与列表项

1 列表的定义以及初始化

列表是实现FreeRTOS最底层的任务排列的数据结构,列表节点就是列表中的一项。使用的是双向链表,也就是一个节点有指向下一个节点和指向上一个节点的指针。

以下是普通节点结构体定义:

节点结构体定义(普通节点结构)
struct xLIST_ITEM
{
	TickType_t xItemValue;             /* 辅助值,用于帮助节点做顺序排列 TickType_t是16位的*/		
	struct xLIST_ITEM *  pxNext;       /* 指向链表下一个节点 */		
	struct xLIST_ITEM *  pxPrevious;   /* 指向链表前一个节点 */	
	void * pvOwner;					   /* 指向拥有该节点的内核对象,通常是TCB */
	void * pvContainer;		           /* 指向该节点所在的链表 */
};
typedef struct xLIST_ITEM  ListItem_t;  /* 节点数据类型重定义 */

普通节点还需要调用一个初始化函数

void vListInitialiseItem( ListItem_t * const pxItem );  (Item是物品的意思,就是列表项)

双向链表有一个所谓的根节点,和普通节点不一样,它的数据结构体里面还包含了一个叫做MiniListItem_t 精简列表项结构体。除此之外,因为它不属于任务任务以及列表(自己属于自己),所以这个省去了普通节点中的pvOwner 和pvContainer。

/* 链表根节点数据结构体定义 */
typedef struct xLIST
{
	UBaseType_t uxNumberOfItems;    /* 链表节点计数器 */
	ListItem_t *  pxIndex;			/* 链表节点索引指针,用于遍历指针 */
	MiniListItem_t xListEnd;		/* 链表最后一个节点,这是一个更精简的节点,包含在根节点中,上面有定义 */
} List_t;

 MiniListItem_t 的定义

struct xMINI_LIST_ITEM
{
	TickType_t xItemValue;                      /* 辅助值,用于帮助节点做升序排列 */
	struct xLIST_ITEM *  pxNext;                /* 指向链表下一个节点的地址 */
	struct xLIST_ITEM *  pxPrevious;            /* 指向链表前一个节点的地址 */
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;  /* 最小节点数据类型重定义 */

 根节点初始化函数 (列表初始化函数,对根节点的初始化相当于列表的初始化)

void vListInitialise( List_t * const pxList );

这个函数初始化的过程理解最开始有点困难,但是实际上就是把一些指针的指向给规定了

2 对列表操作

2.1 插入列表的尾部

void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ); 插入末尾,由于MiniListItem_t结构体中的成员在普通成员都有,所以可以用指向一个普通成员的指针指向MiniListItem_t,这其中存在一个隐式转换。

2.2 辅助排序

按照结构体中的一个叫做结构体辅助排序 xItemValue的值从小到大排序

void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem );

2.3  删除节点

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove );

这个函数带参数返回,返回的是当前链表中剩余的节点数目。

其它的用到再说

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值