列表和列表项是 FreeRTOS 的一个数据结构,FreeRTOS 大量使用到了列表和列表项。
一、什么是列表和列表项
1、列表
列表是 FreeRTOS 中的一个数据结构,被用来跟踪 FreeRTOS 中的任务。与列表相关的全部东西都在文件 list.c 和 list.h中。
List_t 结构体:
-
其中,listFIRST_LIST_INTEGRITY_CHECK_VALUE 和 listSECOND_LIST_INTEGRITY_CHECK_VALUE 都是用来检查列表完整性的,需要将宏 configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 设置为 1,开启以后会向这两个地方分别添加一个变量 xListIntegrityValue1 和 xListIntegrityValue2,在初始化列表的时候会这两个变量中写入一个特殊的值,默认不开启这个功能。
-
uxNumberOfItems 用来记录列表中列表项的数量。
-
pxIndex 用来记录当前列表项索引号,用于遍历列表。
-
xListEnd 列表中最后一个列表项,用来表示列表结束。
2、列表项
列表项就是存放在列表中的项目,FreeRTOS 提供了两种列表项:列表项和迷你列表项。这两个都在文件 list.h中有定义。
列表项:
- listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE 和 listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE 用法和列表一样,用来检查列表项完整性的。
- xItemValue 为列表项值;
- pxNext 指向下一个列表项;
- pxPrevious 指向前一个列表项和 pxNext 配合起来实现类似双向链表的功能;
- pvOwner 记录此列表项归谁拥有,通常是任务控制块;
- pvContainer 用来记录此列表项归哪个列表;
迷你列表项:
- listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE 用于检查迷你列表项的完整性;
- xItemValue 记录列表列表项值;
- pxNext 指向下一个列表项;
- pxPrevious 指向上一个列表项;
可以看出迷你列表项只是比列表项少了几个成员变量,有些情况下不需要列表项这么全的功能,可能只需要其中的某几个成员变量,如果此时用列表项的话就会造成资源浪费。