FreeRTOS学习记录(二)列表项和列表

4. 列表项和列表

在以下程序中,当打开 configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 宏时,函数、结构体中出现的一些宏可能被替换成一些语句、变量,但是目前不明白具体作用,所以暂时默认不开启这个宏

若想学习链表知识,FreeRTOS的有关列表的程序(在list.c 和 list.h 文件中)值得深入研究一下,会对学习链表有很大帮助,尤其是双向链表。学习时结合画图更容易理解指针指向关系

4.1 列表项

4.1.1 普通列表项结构

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;
  • xItemValue: 列表项的值
  • pxNext: 指针,指向下一个列表项
  • pxPrevious: 指针,指向上一个列表项
  • pvOwner: 记录此列表项归谁所有,通常指任务控制块
  • pvContainer: 记录此列表项归哪个列表所有

4.1.2 迷你列表项结构

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;

4.1.3 列表项初始化

void vListInitialiseItem( ListItem_t * const pxItem );

将列表项中 pvContainer 成员 指向 NULL

4.2 列表

4.2.1 列表结构

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;
  • uxNumberOfItems: 记录列表中列表项的数量(不包含那个迷你列表项)
  • pxIndex: 列表索引,指向当前列表索引的那个列表项
  • xListEnd: 迷你列表项,作为列表的末尾

4.2.2 列表初始化

void vListInitialise( List_t * const pxList );

索引值pxIndex 指向迷你列表项,并将迷你列表项的值xItemValue设为最大(在以后插入列表项时,可以始终排在最后),并将列表设置成双向列表

4.3 插入列表项

4.3.1 向列表中插入列表项

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

根据列表项中 xItemValue 成员的值,按照由小到大的顺序插入列表中

4.3.2 向列表末尾插入列表项

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

插入末尾并非真正意义上的末尾,而是列表中 pxIndex 成员指向的列表项的 前面

4.4 列表项的删除

UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove );

若要删除的列表项为当前列表的索引 pxIndex ,则将索引指向一个列表项

返回值:列表中含有的列表项的数量(不包含迷你列表项)

4.5 列表的遍历

#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

你可能感兴趣的:(FreeRTOS,列表,指针,链表,freertos)