最近一直在看关于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列表项数据结构如下图所示:

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项,该数值用来表示每一个列表项的数值,一般列表项依据此值进行列表的插入排序。
#
本文深入解读FreeRTOS内核源码中的列表和列表项,探讨其数据结构与操作函数,如listSET_LIST_ITEM_OWNER、vListInitialise等,解析这些元素如何在系统中起到关键作用,维护FreeRTOS的有序运行。
最低0.47元/天 解锁文章
413

被折叠的 条评论
为什么被折叠?



