Bootstrap

FreeRTOS_列表和列表项

内容主要来源于正点原子的FreeRTOS开发手册
本文主要是做笔记,以及日后复习



1 什么是列表和列表项

1.1 列表

列表是FreeRTOS中的一种数据类型,和数据结构中的链表有一些相似。列表用来跟踪FreeRTOS的任务。(在list.h中定义了

列表的数据类型结构:

/*
 * Definition of the type of queue used by the scheduler.
 */
typedef struct xLIST
{
   
	listFIRST_LIST_INTEGRITY_CHECK_VALUE				/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
	configLIST_VOLATILE UBaseType_t uxNumberOfItems;
	ListItem_t * configLIST_VOLATILE pxIndex;			/*< Used to walk through the list.  Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */
	MiniListItem_t xListEnd;							/*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */
	listSECOND_LIST_INTEGRITY_CHECK_VALUE				/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
} List_t;


变量 描述
uxNumberOfItems 用来记录列表项的数量
pxIndex 用来记录当前的列表项索引号
xListEnd 列表的最后一个列表项,用来表示列表的结束。

其他的两个结构体成员不用管,用来检查列表完整性。所以一个列表如下图所示。
在这里插入图片描述

1.2 列表项

列表项就是存放在列表中。FreeRTOS提供了两种列表项:列表项以及迷你列表项(在list.h中定义了

1.2.1 列表项

/*
 * Definition of the only type of object that a list can contain.
 */
struct xLIST_ITEM
{
   
	listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE			/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
	configLIST_VOLATILE TickType_t xItemValue;			/*< The value being listed.  In most cases this is used to sort the list in descending order. */
	struct xLIST_ITEM * configLIST_VOLATILE pxNext;		/*< Pointer to the next ListItem_t in the list. */
	struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;	/*< Pointer to the previous ListItem_t in the list. */
	void * pvOwner;										/*< Pointer to the object (normally a TCB) that contains the list item.  There is therefore a two way link between the object containing the list item and the list item itself. */
	void * configLIST_VOLATILE pvContainer;				/*< Pointer to the list in which this list item is placed (if any). */
	listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE			/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
};

typedef struct xLIST_ITEM ListItem_t;					/* For some reason lint wants this as two separate definitions. */

变量 描述
xItemValue 列表项值
pxNext 指向下一个列表项
pxPrevious 指向那个上一个列表项(和pxNext配合,可以构成双向链表)
pvOwner 记录此列表项归谁所有(一般是任务控制块)
pvContainer 记录此列表项归哪个列表所有 ( pvcontainer用来记录此列表项归哪个列表。注意和 pvowner 的区别,在前面讲解任务控制块TCBt的时候说了在TCBt中有两个变量 x Statelistitem和 Xeventlistitem,这两个变量的类型就是 Listitem_t,也就是说这两个成员变量都是列表项。以 xstate Listitem为例,当创建个任务以后 xstate Listitem的 pvowner变量就指向这个任务的任务控制块,表示 x Satelistltem属于此任务。当任务就绪态以后 Xstate Listitem的变量 container就指向就绪列表,表明此列表项在就绪列表中。

所以一个列表项如下图所示。

在这里插入图片描述

1.2.2 迷你列表项

列表项有些功能在实际开发中可能不需要,所以为了避免内存浪费,有了迷你列表项

struct xMINI_LIST_ITEM
{
   
	listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE			/*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
	configLIST_VOLATILE TickType_t xItemValue;
	
;