一、什么是列表和列表项
1、列表
列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。与列表相关的全部东西都在文件list.c和list.h中。在list.h中定义了一个叫List_t的结构体,如下:
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE (1)
configLIST_VOLATILE UBaseType_t uxNumberOfItems; (2)
ListItem_t *configLIST_VOLATILE pxIndex; (3)
MiniListItem_t xListEnd; (4)
listSECOND_LIST_INTEGRITY_CHECK_VALUE (5)
}List_t;
(1) 和(5)、这两个都是用来检查列表完整性的,需要将宏
configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES设置为1,开启以后会向这两个地方分别添加一个变量xListIntegrityValue1和xListIntegrityValue2,在初始化列表的时候会这两个变量中写入一个特殊的值,默认不开启这个功能。
(2)、uxNumberOfItems用来记录列表中列表项的数量。
(3)、pxIndex用来记录当前列表项索引号,用于遍历列表。
(4)、列表中最后一个列表项,用来表示列表结束,此变量类型为MiniListItem_t,这是一个
迷你列表项。
列表结构示意图如下所示:
注意:上图并未列出列表完整性检查的成员变量。
2、列表项
列表项就是存放在列表中的项目,FreeRTOS提供了两种列表项:列表项和迷你列表项。这
两个都在文件list.h中有定义,先来看一下列表项,定义如下:
struct xLIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE (1)
configLIST_VOLATILE TickType_t xItem Value; (2)
struct xLIST_ITEM* configLIST_VOLATILE pxNext; (3)
struct xLIST_ITEM* configLIST_VOLATILE pxPrevious; (4)
void* pvOwner; (5)
void*configLIST_VOLATILE pvContainer; (6)
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE (7)
};
typedef struct xLIST_ITEM ListItem_t;
(1) 和(7) 、用法和列表一样,用来检查列表项完整性的。
(2)、xItemValue为列表项值。
(3)、pxNext指向下一个列表项。
(4)、pxPrevious指向前一个列表项,和pxNext配合起来实现类似双向链表的功能。
(5)、pvOwner记录此链表项归谁拥有,通常是任务控制块。
(6)、pvContainer用来记录此列表项归哪个列表。注意和pvOwner的区别。
列表项结构示意图如下图所示:
注意:上图并未列出列表项完整性检查的成员变量
3、迷你列表项
现在来看一下迷你列表项,迷你列表项在文件list.h中有定义,如下:
struct xMINI_LIST_ITEM
{
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE (1)
configLIST_VOLATILE TickType_t xItemValue; (2)
struct xLIST_ITEM*configLIST_VOLATILE pxNext; (3)
struct xLIST_ITEM*configLIST_VOLATILE pxPrevious; (4)
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;
(1)、用于检查迷你列表项的完整性。
(2)、xltemValue记录列表列表项值。
(3)、pxNext指向下一个列表项。
(4)、pxPrevious指向上一个列表项。
可以看出迷你列表项只是比列表项少了几个成员变量,迷你列表项有的成员变量列表项都有的,没感觉有什么本质区别啊?那为什么要弄个迷你列表项出来呢?那是因为有些情况下不需要列表项这么全的功能,可能只需要其中的某几个成员变量,如果此时用列表项的话会造成内存浪费!比如上面列表结构体List_t中表示最后一个列表项的成员变量xListEnd就是
MiniListItem_t类型的。
迷你列表项结构示意图如下图所示:
注意:上图并未列出迷你列表项完整性检查的成员变量。