1. FreeRTOS列表和列表项
1.1 列表和列表项的简介
列表是FreeRTOS中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。 在OS中任务的数量是不确定的,并且任务状态是会发生改变的,所以非常适用列表(链表)这种数据结构。
列表项就是存放列表中的项目。
1.1.1 特点
- 列表相当于链表,列表项相当于节点,FreeRTOS中的列表是一个双向环形链表
- 列表是列表项间的地址非连续的,是人为的连接到一起的。列表项的数目是由后期添加的个数决定的,随时可以改变。
- 而数组成员地址是连续的,在最初确定了成员数量后期无法改变
列表
typedef struct xLIST{
listFIRSI_LISI_INTEGRIIY_CHECK_VALUE /*校验值*/
volatile uBaseIype_t uxNumberQfItems; /*列表中的列表项数量*/
ListItem_t *configLIST_VOLATILE pxIndex /*用于遍历列表项的指针*/
MinilListltem_t xListEnd /*末尾列表项*/
listSECOND_LIST_INTEGRITY_CHECK_VALUE /*校验值*/
}List_t;
- 在该结构体中,包含了两个宏,这两个宏是确定的已知常量,FreeRTOS通过检查这两个常量的值,来判断列表的数据在程序运行过程中,是否遭到破坏,该功能一般用于调试,默认是不开启的。
- 成员uxNumberOfltems,用于记录列表中列表项的个数(不包含xListEnd)。
- 成员pxlndex用于指向列表中的某个列表项,一般用于遍历列表中的所有列表项。
- 成员变量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 Listltem_t;
- 成员变量xItemValue为列表项的值,这个值多用于按升序对列表中的列表项进行排序
- 成员变量pxNext和pxPrevious分别用于指向列表中列表项的下一个列表项和上一个列表项
- 成员变量pxOwner用于指向包含列表项的对象(通常是任务控制块)
- 成员变量pxContainer 用于指向列表项所在列表。
2.列表相关API函数
-
列表初始化函数
vListInitialise()
1. 初始化时,列表中只有xListEnd,因此 pxIndex指向xListEnd2; 2. xListEnd的值初始化为最大值,用于列表项升序排序时,排在最后; 3. 初始化时,列表中只有xListEnd,因此上一个和下一个列表项都为xListEnd本身; 4. 初始化时,列表中的列表项数量为0(不包含xListEnd)
-
列表项初始化函数
vListInitialiseltem()
初始化时,列表项不属于任何一个列表,所以为空
-
列表项插入函数
vListInsert()
是将待插入列表的列表项按照列表项值升序进行排序,有序地插入到列表中 1. 获取新插入的列表项的值 2. 判断新插入的列表项数值大小 如果数值等于末尾列表项的数值。就插入到末尾列表项前面; 否则遍历列表中的列表项,找到插入的位置 3. 将列表项插入前面所找到的位置 4. 更新待插入列表项所在列表 5. 更新列表中列表项的数量
-
末尾列表项插入函数
vListInsertEnd()
是一种无序的插入方法! 1. 获取列表pxIndex指向的列表项 2. 将待插入的列表项插入到pxIndex所指向的列表项前面 3. 更新待插入列表项的所在列表 4. 更新列表中列表项的数量
-
列表项移除函数
uxListRemove()
1. 获取所要移除的列表项的所在列表 2. 从列表中移除列表项 3. 如果pxIndex正指向待移除的列表项,将其指向待移除的上一个列表项 4. 将待移除列表项的所在列表指针清空 5. 列表的列表项数目减一 6. 返回列表项移除后列表中列表项的数量