一、列表和列表项的简介
1、列表
列表是FreeRTOS中一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务
列表相当于链表,列表项相当于节点,FreeRTOS中的列表是一个双向环形链表。
列表的特点:列表项间的地址非连续的,是人为的连接到一起的,列表项的数目是由后期添加的个数决定的,随时可以改变。
数组的特点:数组成员地址是连续的,数组在最初确定了成员数量后期无法改变
2、列表项
列表项就是存放在列表中的项目
在OS中任务的数量是不确定的,并且任务状态是会发生改变的,所以非常适用列表(链表)这种数据结构。
3、列表的结构体
(1)在该结构体中,包含了两个宏(listFIRST_LIST_INTEGRITY_CHECK_VALUE / listSECOND_LIST_INTEGRITY_CHECK_VALUE),这两个宏是确定的已知常量,FreeRTOS通过检查这两个常量的值,来判断列表的数据在程序运行过程中,是否遭到破坏,该功能一般用于调试,默认是不开启的
(2)成员uxNumberOfltems,用于记录列表中列表项的个数(不包含xListEnd)
(3)成员pxIndex用于指向列表中的,某个列表项,一般用于遍历列表中的所以列表项
(4)成员xlisEnd是一个迷你列表项,排在最末尾
4、列表项的结构体
(1)成员变量xItemValue为列表项的值,这个值多用于按升序对列表中的列表项进行排列
(2)成员变量pxNext pxPrevious分别用于指向列表中列表项的下一个列表项和上一个列表项
(3)成员变量pxOwner用于指向包含列表项的对象(通常是任务控制块)
(4)成员变量pxContainer拥有指向列表项所在列表 (就绪、阻塞、挂起)
5、迷你列表项
迷你列表项也是列表项,但迷你列表项仅用于标记列表的末尾和挂载其他插入列表中的列表项
(1)成员变量xItemValue为列表项的值,这个值多用于按升序对列表中的列表项进行排列
(2)成员变量pxNext pxPrevious分别用于指向列表中列表项的下一个列表项和上一个列表项
6、列表和列表项的关系
二、列表相关API函数介绍
函数 | 描述 |
vListInitialise() | 初始化列表 |
vListInitialiseItem() | 初始化列表项 |
vListInsertEnd() | 列表末尾插入列表项 |
vListInsert() | 列表插入列表项(升序插入) |
uxListRemove() | 列表移除列表项 |
1、初始化列表 vListInitialise()
2、初始化列表项 vListInitialiseItem()
3、列表插入列表项(升序插入)vListInsert()
pxList(列表)
pxNewListIem(待插入列表项)
函数vListInsert(),是将待插入列表的列表项按照列表项值升序进行排序,有序地插入到列表中。
4、列表末尾插入列表项 vListInsertEnd()
pxList:列表
pxNewListItem:待插入列表项
此函数用于将待插入列表的列表项插入到列表pxIndex指针指向的列表项前面,是一种无序的插入方法。
5、列表移除列表项 uxListRemove()
此函数用于将列表项从列表项所在列表中移除。
pxItemToRemove:带移除的列表项
返回值:整数:带移除列表项移除后,所在列表剩余列表项的数量
三、列表项的插入和删除实验
1、实验目的:学会FreeRTOS列表和列表项的操作函数使用,并观察运行结果和理论分析是否一致。
2、实验设计:将设计三个任务:start_task、task1、task2
start_task:用来创建其他的2个任务
task1:实现LED0每500ms闪烁一次,用来提示系统正在运行
task2:调用列表和列表项相关API函数,并且通过串口输出相应的信息