在以下程序中,当打开 configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 宏时,函数、结构体中出现的一些宏可能被替换成一些语句、变量,但是目前不明白具体作用,所以暂时默认不开启这个宏
若想学习链表知识,FreeRTOS的有关列表的程序(在list.c 和 list.h 文件中)值得深入研究一下,会对学习链表有很大帮助,尤其是双向链表。学习时结合画图更容易理解指针指向关系
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;
struct xMINI_LIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE
configLIST_VOLATILE TickType_t xItemValue;
struct xLIST_ITEM * configLIST_VOLATILE pxNext;
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;
void vListInitialiseItem( ListItem_t * const pxItem );
将列表项中 pvContainer 成员 指向 NULL
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;
void vListInitialise( List_t * const pxList );
将 索引值pxIndex 指向迷你列表项,并将迷你列表项的值xItemValue设为最大(在以后插入列表项时,可以始终排在最后),并将列表设置成双向列表
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem );
根据列表项中 xItemValue 成员的值,按照由小到大的顺序插入列表中
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem );
插入末尾并非真正意义上的末尾,而是列表中 pxIndex 成员指向的列表项的 前面
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove );
若要删除的列表项为当前列表的索引 pxIndex ,则将索引指向前一个列表项
返回值:列表中含有的列表项的数量(不包含迷你列表项)
#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \
{ \
List_t * const pxConstList = ( pxList ); \
( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \
if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \
{ \
( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \
} \
( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \
}
每使用一次,列表的索引 pxIndex 指向下一个列表项(若下一个为迷你列表项,则指向迷你列表项的下一个),并获取下一个列表项的归属pvOwner