列表与列表项
列表结构体如下
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE //检查列表完整性
configLIST_VOLATILE UBaseType_t uxNumberOfItems; //列表项数量
ListItem_t * configLIST_VOLATILE pxIndex; //列表索引号
MiniListItem_t xListEnd; //表示列表结束
listSECOND_LIST_INTEGRITY_CHECK_VALUE //检查列表完整性
} List_t;
列表项结构体如下(迷你列表项在列表项基础上减少了一些成员变量)
struct xLIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE //检查列表完整性
configLIST_VOLATILE TickType_t xItemValue; //列表项值
struct xLIST_ITEM * configLIST_VOLATILE pxNext; //指向下一个列表项
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; //指向前一个列表项
void * pvOwner; //记录此列表项归谁所有
void * configLIST_VOLATILE pvContainer; //记录此列表项归哪个列表
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE //检查列表完整性
};
typedef struct xLIST_ITEM ListItem_t;
2、列表与列表项相关函数
vListInitialise() :列表初始化函数,初始化时列表项数量为0,说明xListEnd没有被算入进去。
vListInitialiseItem() :列表项初始化函数,实际只对归属项初始化为NULL。
vListInsert() :列表项插入函数,其函数原型如下,无返回值。
变体vListInsertEnd()插入到列表项末尾。
void vListInsert( List_t * const pxList, //pxList: 列表项要插入的列表。
ListItem_t * const pxNewListItem ) //pxNewListItem: 要插入的列表项。
uxListRemove() :列表项删除函数,其函数原型如下,返回值为删除后的列表剩余列表项数目。
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )//pxItemToRemove:要删除的列表项
列表项的删除只是将指定的列表项从列表中删除掉,并不会将这个列表项的内存给 释放掉!
listGET_OWNER_OF_NEXT_ENTRY():列表遍历函数,每调 用一次这个函数列表的 pxIndex 变量就会指向下一个列表项,并且返回这个列表项的 pxOwner 变量值。这个函数本质上是一个宏。用于多个同优先级的就绪任务中查找下一个要运行的任务。
3、实验拓展
上图为列表插入三个列表项,以上图作为参考,可得:
pxIndex指向的地址和xListEnd(迷你列表项,包含列表值、后一指针、前一指针)的地址相同。
即pxIndex指向了xListEnd!!!
相应的,列表(列表项)与列表项链接后,pxNext指向的就是后一个列表项原本地址,pxPrevious指向前一个列表项原本地址。
上图插入不是升序插入,当使用vListInsert()时,默认以xItemValue(列表项值)的升序方式插入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)