注:在使用大多数功能时,FreeRTOS都要将对应的宏置为1,具体的需要查看FreeRTOS官方文档。
FromlSR后缀的函数是专用于中断的API函数。
列表和列表项简介
列表是 FreeRTOS 中一种数据结构,概念上有点像链表,用来追踪FreeRTOS中的任务。
列表项就是存放在列表中的项目。
可以看到,列表就相当于链表,列表项则相当于节点,FreeRTOS中的列表其实是一个双向环形链表。
特点:列表项间地址是非连续的;列表项数目是由人为选择来决定的。
在FreeRTOS中,每一个列表项用于存储一个任务。
列表
列表结构体如下,
typedef struct xLIST
{
listFIRST_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */
volatile UBaseType_t uxNumberOfItems; /* 列表中列表项的数量 */
ListItem_t * configLIST_VOLATILE pxIndex; /* 用于遍历列表 */
MiniListItem_t xListEnd; /* 最后一个列表项 */
listSECOND_LIST_INTEGRITY_CHECK_VALUE /* 校验值 */
} List_t;
备注
- 两个校验值的宏用于存放确定已知常量, FreeRTOS通过检查这两个常量的值,来判断列表的数据在程序运行过程中,一般都是用来调试使用。
- uxNumberOfItems 用于记录列表中列表项的个数(不包含 xListEnd)
- pxIndex 用于指向列表中的某个列表项
- 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 ListItem_t;/* 重定义成 ListItem_t */
备注:
- xItemValue 为列表项的值,这个值多用于按升序对列表中的列表项进行排序。
- pxNext 和 pxPrevious 分别用于指向列表中列表项的下一个列表项和上一个列表项,用于与其他列表形成手拉手的形式。
- pxOwner 用于指向包含列表项的对象(通常是任务控制块),也就是一个列表项代表一个任务。
- pxContainer 用于指向列表项所在列表,比如就绪列表,阻塞列表,挂起列表等。
迷你列表项
迷你列表项也是列表项,但迷你列表项仅用于标记列表的末尾和挂载其他插入列表中的列表项。。
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 */
备注 :
迷你列表项其实也是列表项,只不过相比于列表项,因为只用于标记列表的末尾和挂载其他插入列表中的列表项,因此不需要成员变量 pxOwner 和 pxContainer,以节省内存开销。
标记列表末尾:就是在列表创建时会自动创建迷你列表项,也就是末尾列表项,并将xItemValue的值设置为最大,也就是0xFFFFFFFF,让其成为列表的末尾
挂载其他插入列表中的列表项:简单理解就是,在列表刚创建时就会创建迷你列表项,当其他列表插入时,就能通过迷你列表项的首和尾进行相连,起到所谓的挂载作用。