FreeRTOS内核源码解读之-------列表和列表项(一)

本文深入解读FreeRTOS内核源码中的列表和列表项,探讨其数据结构与操作函数,如listSET_LIST_ITEM_OWNER、vListInitialise等,解析这些元素如何在系统中起到关键作用,维护FreeRTOS的有序运行。
摘要由CSDN通过智能技术生成

最近一直在看关于FreeRTOS内核源码,里面涉及很多列表和列表项的内容,因此需要好好研究一下。这部分内容在FreeRTOS中起着很重要的作用,如果把FreeRTOS比作一个人的话,那么列表和列表项就相当于人的神经系统,管理整个FreeRTOS系统有条不紊的运行。
首先,要明确列表项和列表是两个不同的概念,在FreeRTOS中是两个不同的数据结构。这一点,我在刚开始接触的时候经常混淆。通俗点说,列表是用来表示一条条双向链表,列表项就是在链表中的每一项。类比一下:列表就是一条条铁链子,列表项就是一条铁链子上面的铁环。
将用两篇文章解读FreeRTOS中关于列表项和列表的知识,第一篇主要介绍源码中关于列表项和列表数据结构,以及操作函数。

一、关于结构体

1、列表项数据结构

列表项数据结构如下图所示:
列表项数据结构

struct xLIST_ITEM
{
   
	listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE			/*< 捕捉已知的数值在应用程序运行期间是否被损坏,只有宏configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES非0时有效,此时为TickType_t xListItemIntegrityValue1; */
	configLIST_VOLATILE TickType_t xItemValue;			/* 列表项数值,一般对列表项进行排序时会依据此数值。由于使用的是32位的MCU,因此该数据项的类型为uint32_t */
	struct xLIST_ITEM * configLIST_VOLATILE pxNext;		/*< 列表项是采用双向链表的形式连接在链表中的,该数据项用于指向前一个列表项 */
	struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;	/* 指向后一个列表项 */
	void * pvOwner;										/* 一般是指向TCB指针,用来指向包含本列表向对象的那一个线程控制块(TCB)指针,线程控制块对象和列表项对象之间是双向连接(你指向我,我指向你)。*/
	void * configLIST_VOLATILE pvContainer;				/* 用来指向该列表项对象挂接的列表对象的指针,用来说明具体挂接在哪个列表上面 */
	listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE			/* 同listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE,用于判断运行期间数据是否被破坏 */
};
typedef struct xLIST_ITEM ListItem_t;					/* For some reason lint wants this as two separate definitions. */
2、mini列表项数据结构

mini列表项数据结构如下图所示:
mini列表项数据结构

struct xMINI_LIST_ITEM
{
   
	listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE			/*捕捉已知的数值在应用程序运行期间是否被损坏,只有宏configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES非0时有效,此时为TickType_t xListItemIntegrityValue1;  */
	configLIST_VOLATILE TickType_t xItemValue;  /*列表项数值,一般对列表项进行排序时会依据此数值。由于使用的是32位的MCU,因此该数据项的类型为uint32_t */
	struct xLIST_ITEM * configLIST_VOLATILE pxNext;  /*< 列表项是采用双向链表的形式连接在链表中的,该数据项用于指向前一个列表项 */
	struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;  /* 指向后一个列表项 */
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;
3、列表数据结构

列表数据结构如下图所示:
列表数据结构

typedef struct xLIST
{
   
	listFIRST_LIST_INTEGRITY_CHECK_VALUE				/*捕捉已知的数值在应用程序运行期间是否被损坏,只有宏configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES非0时有效, TickType_t xListIntegrityValue1 */
	configLIST_VOLATILE UBaseType_t uxNumberOfItems;  /* 记录列表中含有列表项的个数 */
	ListItem_t * configLIST_VOLATILE pxIndex;			/*< 用于遍历列表。 指向通过调用listGET_OWNER_OF_NEXT_ENTRY()返回的下一项。 */
	MiniListItem_t xListEnd;							/*<列表最后一个列表项,该列表项是一个mini列表项 */
	listSECOND_LIST_INTEGRITY_CHECK_VALUE				/*<捕捉已知的数值在应用程序运行期间是否被损坏,只有宏configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES非0时有效, TickType_t xListIntegrityValue2 */
} List_t;

二、关于操作函数

1、listSET_LIST_ITEM_OWNER
#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner )		( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) //用于设置一个列表项数据结构中的pxOwner项,一般是一个任务控制块指针。
2、listGET_LIST_ITEM_OWNER
#define listGET_LIST_ITEM_OWNER( pxListItem )	( ( pxListItem )->pvOwner ) //用于获得列表项所有者,实际上获得某一个列表是属于哪一个任务控制块
3、listSET_LIST_ITEM_VALUE
//用于设置列表项结构体的xItemValue项,该数值用来表示每一个列表项的数值,一般列表项依据此值进行列表的插入排序。
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值