FreeRTOS的列表
列表
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; /*指向一个任务TCB*/
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;
pxReturn = ( xExecutingBufferDescriptor_t * ) listGET_OWNER_OF_HEAD_ENTRY( &xExecuting_FreeBuffersList );
#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner )
( pxList )->xListEnd ):列表的xListEnd,列表中的最后一个列表项,类型是MiniListItem_t
(&( ( pxList )->xListEnd ))->pxNext:指向下一个列表项
由于列表中的列表项是一个循环项,所以最后一个列表项的下一个列表就是列表的第一个列表项
( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ):列表项的pvOwner,记录列表归谁拥有,通常是任务控制块
void * pvOwner; 表示定义一个pvOwner指针,指向目标的类型是void
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; 表示定义一个pxPrevious的指针,指向的目标是xLIST_ITEM 结构体