九、FreeRTOS之FreeRTOS列表和列表项
本节需要掌握以下内容:
1,列表和列表项的简介(熟悉)
2,列表相关API函数介绍(掌握)
3,列表项的插入和删除实验(掌握)
4,课堂总结(掌握)
一,列表和列表项的简介(熟悉)
1.1 列表
列表是 FreeRTOS 中的一个数据结构,概念上和链表有点类似,列表被用来跟踪 FreeRTOS中的任务列表项就是存放在列表中的项目
列表相当于链表,列表项相当于节点,FreeRTOS 中的列表是一个双向环形链表
列表的特点:列表项间的地址非连续的,是人为的连接到一起的。列表项的数目是由后期添加的个数决定的,随时可以改变
数组的特点:数组成员地址是连续的,数组在最初确定了成员数量后期无法改变
在OS中任务的数量是不确定的,并且任务状态是会发生改变的,所以非常适用列表(链表)这种数据结构
举个例子:
有关于列表的东西均在文件 list.c 和 list.h 中,首先我们先看下在list.h中的,列表相关结构体:
1、在该结构体中, 包含了两个宏,这两个宏是确定的已知常量, FreeRTOS通过检查这两个常量的值,来判断列表的数据在程序运行过程中,是否遭到破坏 ,该功能一般用于调试, 默认是不开启的
2、成员uxNumberOfItems,用于记录列表中列表项的个数(不包含 xListEnd)
3、成员 pxIndex 用于指向列表中的某个列表项,一般用于遍历列表中的所有列表项
4、成员变量 xListEnd 是一个迷你列表项,排在最末尾
列表结构示意图
1.2 列表项
列表项是列表中用于存放数据的地方,在 list.h 文件中,有列表项的相关结构体定义:
1、成员变量 xItemValue 为列表项的值,这个值多用于按升序对列表中的列表项进行排序
2、成员变量 pxNext 和 pxPrevious 分别用于指向列表中列表项的下一个列表项和上一个列表项
3、成员变量 pxOwner 用于指向包含列表项的对象(通常是任务控制块)
4、成员变量 pxContainer 用于指向列表项所在列表。
列表项结构示意图
1.3 迷你列表项
1、成员变量 xItemValue 为列表项的值,这个值多用于按升序对列表中的列表项进行排序
2、成员变量 pxNext 和 pxPrevious 分别用于指向列表中列表项的下一个列表项和上一个列表项
3、迷你列表项只用于标记列表的末尾和挂载其他插入列表中的列表项,因此不需要成员变量 pxOwner 和 pxContainer,以节省内存开销
迷你列表项结构示意图
1.4 列表和列表项的关系
二,列表相关API函数介绍(掌握)
函数 | 描述 |
vListInitialise() | 初始化列表 |
vListInitialiseItem() | 初始化列表项 |
vListInsertEnd() | 列表末尾插入列表项 |
vListInsert() | 列表插入列表项 |
uxListRemove() | 列表移除列表项 |
参考文档:《FreeRTOS开发指南》第七章 ——“FreeRTOS列表和列表项”
2.1 初始化列表vListInitialise()
形参 | 描述 |
pxList | 待初始化列表 |
初始化后列表结构
2.2 函数 vListInitialiseItem()
形参 | 描述 |
pxItem | 待初始化列表项 |
初始化后的列表项结构
2.3 函数vListInsert()
void vListInsert ( List_t * const pxList , ListItem_t * const pxNewListItem )
此函数用于将待插入列表的列表项按照列表项值升序进行排序,有序地插入到列表中
形参 | 描述 |
pxList | 列表 |
pxNewListItem | 待插入列表项 |
代码详解查看手册《FreeRTOS开发指南》第七章 ——“FreeRTOS列表和列表项”
插入值为40的列表项
将列表项xList_Item1,插入列表List中
插入值为60的列表项
在前面的基础上,在插入值为60的列表项,结果如下:
插入值为50的列表项
在前面的基础上,在插入值为50的列表项,结果如下:
总结:函数vListInsert(),是将待插入列表的列表项按照列表项值升序进行排序,有序地插入到列表中
2.4 函数 vListInsertEnd()
形参 | 描述 |
pxList | 列表 |
pxNewListItem | 待插入列表项 |
此函数用于将待插入列表的列表项插入到列表 pxIndex 指针指向的列表项前面,是一种无序的插入方法
列表项末尾插入图示
假设默认列表如下:
此时插入值为30的列表项2,结果如何?
明天再更!困了,想睡觉!