列表与列表项简介
列表和列表项是FreeRTOS中的一个数据结构,FreeRTOS中使用了大量的列表和列表项,是FreeRTOS的基石。
列表
列表在概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。与列表相关的全部东西都在文件list.c和list.h中。
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE //(1)
volatile UBaseType_t uxNumberOfItems; //(2)
ListItem_t * configLIST_VOLATILE pxIndex; //(3)
MiniListItem_t xListEnd; //(4)
listSECOND_LIST_INTEGRITY_CHECK_VALUE //(5)
} List_t;
(1) 和 (5)都是用来检查列表完整行的
(2) uxNumberOfItems 记录列表中列表项的数量
(3) pxIndex 用于遍历列表
(4) 列表中最后一个列表项,用来表示列表结束
不考虑完整性检测列表结构如下图:
列表项
struct xLIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE //(1)
configLIST_VOLATILE TickType_t xItemValue; //(2)
struct xLIST_ITEM * configLIST_VOLATILE pxNext; //(3)
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; //(4)
void * pvOwner; //(5)
void * configLIST_VOLATILE pvContainer; //(6)
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE //(7)
};
typedef struct xLIST_ITEM ListItem_t;
(1) 和 (7)用来检查列表项完整性
(2) xItemValue 为列表项值
(3) pxNext 指向下一个列表项
(4) pxPrevious 指向前一个列表项,和 pxNext 配合起来实现类似双向列表的功能
(5) pvOwner 记录此列表项归谁拥有,通常是任务控制块
(6) pvContainer 记录此列表项归哪个列表
不考虑完整性检测列表项结构如下图:
相关API函数
函数 | 描述 |
---|---|
vListInitialise() | 列表初始化 |
vListInitialiseItem() | 列表项初始化 |
vListInsert() | 列表项插入 |
vListInsertEnd() | 列表项末尾插入 |
uxListRemove() | 列表项删除 |
ListGET_OWNER_OF_NEXT_ENTRY() | 列表的遍历 |