列表和列表项
列表和列表项简介
列表是 FreeRTOS 中的一个数据结构,概念上和链表有点类似,列表被用来跟踪 FreeRTOS中的任务。
列表项就是存放在列表中的项目
列表相当于链表,列表项相当于节点,FreeRTOS 中的列表是一个双向环形链表
列表的特点:列表项间的地址**非连续的**,是人为的连接到一起的。列表项的数目是由后期添加的个数决定的,随时可以改变
**数组的特点:**数组成员地址是连续的,数组在最初确定了成员数量后期无法改变
在OS中任务的数量是不确定的,并且任务状态是会发生改变的,所以非常适用列表(链表)这种数据结构
列表结构体
列表的东西均在文件 list.c 和 list.h 中
先来看看ist.h中的列表相关结构体
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */
volatile UBaseType_t uxNumberOfItems; /* 列表中的列表项数量 */
ListItem_t * configLIST_VOLATILE pxIndex /* 用于遍历列表项的指针 */
MiniListItem_t xListEnd /* 末尾列表项 */
listSECOND_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */
} List_t;
- 上述代码的校验值用来列表的数据在程序运行过程中,是否遭到破坏 ,该功能一般用于调试, 默认是不开启的
- 成员uxNumberOfItems,用于记录列表中列表项的个数(不包含 xListEnd)
- 成员 pxIndex 用于指向列表中的某个列表项,一般用于遍历列表中的所有列表项
- 成员变量 xListEnd 是一个迷你列表项,排在最末尾
- 列表结构示意图
列表项结构体
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 /* 列表项的拥有者 */
struct xLIST * configLIST_VOLATILE pxContainer; /* 列表项所在列表 */
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /* 用于检测列表项的数据完整性 */
};
typedef struct xLIST_ITEM ListItem_t;
- 成员变量 xItemValue 为列表项的值,这个值多用于按升序对列表中的列表项进行排序
- 成员变量 pxNext 和 pxPrevious 分别用于指向列表中列表项的下一个列表项和上一个列表项
- 成员变量 pxOwner 用于指向包含列表项的对象(通常是任务控制块)
- 成员变量 pxContainer 用于指向列表项所在列表。
- 列表项结构示意图
迷你列表项
迷你列表项也是列表项,但迷你列表项仅用于标记列表的末尾和挂载其他插入列表中的列表项
结构体介绍
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;
- 成员变量 xItemValue 为列表项的值,这个值多用于按升序对列表中的列表项进行排序
- 成员变量 pxNext 和 pxPrevious 分别用于指向列表中列表项的下一个列表项和上一个列表项
- 迷你列表项只用于标记列表的末尾和挂载其他插入列表中的列表项,因此不需要成员变量 pxOwner 和 pxContainer,以节省内存开销
- 迷你列表项结构示意图
列表和列表项的关系
列表初始状态,以及即将插入的两个列表项如下:
插入一个
再插入一个
以上两张图很清晰的解释 了插入的过程(末尾列表项的下一个是列表项1,列表项1的前一个是末尾列表项,可以抽象成所有列表项围成一个圈,和双向链表是一样的)