FreeRTOS的列表和列表项
一、列表与列表项的简介:
列表的简介:
列表是 FreeRTOS 中最基本的一种数据结构,其在物理存储单元上是非连续、非顺序的。 列表在 FreeRTOS 中的应用十分广泛,要注意的是,FreeRTOS 中的列表是一个双向链表,在 list.h 文件中,有列表的相关定义,具体代码如下所示:
typedef struct xLIST {
1. listFIRST_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */
2. volatile UBaseType_t uxNumberOfItems; /* 列表中列表项的数量 */
3. ListItem_t * configLIST_VOLATILE pxIndex; /* 用于遍历列表 */
4. MiniListItem_t xListEnd; /* 最后一个列表项 */
1. listSECOND_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */
} List_t;
列表中结构体内成员介绍:
结构体中的成员 | 作用 | 备注 |
---|---|---|
1.两个宏:listFIRST_LIST_INTEGRITY_CHECK_VALUE 和 listSECOND_LIST_INTEGRITY_CHECK_VALUE | FreeRTOS 通过检查这两个常量的值,来判断列表的数据在程序运行过程中,是否遭到破坏。 | 该功能一般用于调试,默认是不开启的 |
2.成员变量 :uxNumberOfItems | 用于记录列表中列表项的个数(不包含 xListEnd),当往列表 中插入列表项时,该值加 1;当从列表中移除列表项时,该值减 1 | |
3.成员变量: pxIndex | 用于指向列表中的某个列表项 | 一般用于遍历列表中的所有列表项 |
4.成员变量: xListEnd | 是一个迷你列表项,列表中迷你列表项的值一般被设置为最大值,用于将列表中的所有列表项按升序排序时,排在最末尾; | 同时 xListEnd 也用于挂载其他插入到列表中的列表项 |
列表结构示意图:
列表项的简介:
列表项是列表中用于存放数据的地方,在 list.h 文件中,有列表项的相关定义,具体代码如下所示:
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; /* 重定义成 ListItem_t */
列表项中结构体成员介绍:
结构体中的成员 | 作用 |
---|---|
两个宏:listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE和listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE | 用于检测列表项数据完整性的宏定义 |
成员变量: xItemValue | 为列表项的值,这个值多用于按升序对列表中的列表项进行排序 |
成员变量: pxNext 和 pxPrevious | 分别用于指向列表中列表项的下一个列表项(pxNext)和上一个列 表项(pxPrevious) |
成员变量:pxOwner | 用于指向包含列表项的对象(通常是任务控制块),因此,列表项和 包含列表项的对象之间存在双向链接 |
成员变量 :pxContainer | 用于指向列表项所在列表 |
列表项结构示意图
迷你列表项介绍
迷你列表项也是列表项,但迷你列表项仅用于标记列表的末尾和挂载其他插入列表中的列表项,用户是用不到迷你列表项的,在 list.h 文件中,有迷你列表项的相关定义,具体的代码如下所示:
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; /* 重定义成 MiniListItem_t */
迷你列表项中结构体成员介绍:
结构体中的成员 | 作用 |
---|---|
宏:listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE | 用于检测列表项数据完整性的宏定义 |
成员变量: xItemValue | 为列表项的值,这个值多用于按升序对列表中的列表项进行排序 |
成员变量 :pxNext 和 pxPrevious | 分别用于指向列表中列表项的下一个列表项和上一个列 表项。 |
迷你列表项相比于列表项,因为只用于标记列表的末尾和挂载其他插入列表中的列表项,因此不需要成员变量 pxOwner 和 pxContainer,以节省内存开销。
列表项结构示意图
二、FreeRTOS 列表和列表项相关 API 函数
函数API概览:
函数 | 描述 |
---|---|
vListInitialise() | 初始化列表 |
vListInitialiseItem() | 初始化列表项 |
vListInsertEnd() | 列表末尾插入列表项 |
vListInsert() | 列表插入列表项 |
uxListRemove() | 列表移除列表项 |
函数vListInitialise()
此函数用于初始化列表,在定义列表之后,需要先对其进行初始化,只有初始化后的列表, 才能够正常地被使用。
列表初始化的过程,其实就是初始化列表中的成员变量。函数原型如下所示:
void vListInitialise(List_t * const pxList);
函数 vListInitialise()的形参描述:
pxList 待初始化列表