1 列表的定义以及初始化
列表是实现FreeRTOS最底层的任务排列的数据结构,列表节点就是列表中的一项。使用的是双向链表,也就是一个节点有指向下一个节点和指向上一个节点的指针。
以下是普通节点结构体定义:
节点结构体定义(普通节点结构)
struct xLIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 TickType_t是16位的*/
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */
void * pvOwner; /* 指向拥有该节点的内核对象,通常是TCB */
void * pvContainer; /* 指向该节点所在的链表 */
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */
普通节点还需要调用一个初始化函数
void vListInitialiseItem( ListItem_t * const pxItem ); (Item是物品的意思,就是列表项)
双向链表有一个所谓的根节点,和普通节点不一样,它的数据结构体里面还包含了一个叫做MiniListItem_t 精简列表项结构体。除此之外,因为它不属于任务任务以及列表(自己属于自己),所以这个省去了普通节点中的pvOwner 和pvContainer。
/* 链表根节点数据结构体定义 */
typedef struct xLIST
{
UBaseType_t uxNumberOfItems; /* 链表节点计数器 */
ListItem_t * pxIndex; /* 链表节点索引指针,用于遍历指针 */
MiniListItem_t xListEnd; /* 链表最后一个节点,这是一个更精简的节点,包含在根节点中,上面有定义 */
} List_t;
MiniListItem_t 的定义
struct xMINI_LIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做升序排列 */
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点的地址 */
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点的地址 */
};
typedef struct xMINI_LIST_ITEM MiniListItem_t; /* 最小节点数据类型重定义 */
根节点初始化函数 (列表初始化函数,对根节点的初始化相当于列表的初始化)
void vListInitialise( List_t * const pxList );
这个函数初始化的过程理解最开始有点困难,但是实际上就是把一些指针的指向给规定了
2 对列表操作
2.1 插入列表的尾部
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ); 插入末尾,由于MiniListItem_t结构体中的成员在普通成员都有,所以可以用指向一个普通成员的指针指向MiniListItem_t,这其中存在一个隐式转换。
2.2 辅助排序
按照结构体中的一个叫做结构体辅助排序 xItemValue的值从小到大排序
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem );
2.3 删除节点
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove );
这个函数带参数返回,返回的是当前链表中剩余的节点数目。
其它的用到再说