分析代码的辅助文章,不重要。
目录
链表节点数据结构
struct xLIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ (1)
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ (2)
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ (3)
void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB */(4)
void * pvContainer; /* 指向该节点所在的链表 */ (5)
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ (6)
链表根节点数据结构
typedef struct xLIST
{
UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1)
ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
} List_t
内部嵌套
typedef struct xLIST
{
UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1) //UBaseTyoe_t:unsigned long
ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
struct xMINI_LIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做升序排列 */
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */
};
typedef struct xMINI_LIST_ITEM MiniListItem_t; /* 精简节点数据类型重定义 */
} List_t
链表精简节点
//代码清单 链表精简节点结构体定义
struct xMINI_LIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做升序排列 */
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */
};
typedef struct xMINI_LIST_ITEM MiniListItem_t; /* 精简节点数据类型重定义 */
链表节点初始化
//操作ListItem_t结构体 typedef struct xLIST_ITEM ListItem_t;
void vListInitialiseItem( ListItem_t * const pxItem )
{
/* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */
pxItem->pvContainer = NULL;
//是初始化的时候只需将pvContainer 初始化为空即可,表示该节点还没有插入到任何链表。
}
链表根节点初始化
//操作List_t结构体
//指向自己
//链表根节点初始化
void vListInitialise( List_t * const pxList )
{
/* 将链表索引指针指向最后一个节点 */(1)
pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );
/* 将链表最后一个节点的辅助排序的值设置为最大,确保该节点就是链表的最后节点 */(2)
pxList->xListEnd.xItemValue = portMAX_DELAY;
/* 将最后一个节点的 pxNext 和 pxPrevious 指针均指向节点自身,表示链表为空 */(3)
pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );
pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );
/* 初始化链表节点计数器的值为 0,表示链表为空 */(4)
pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
}
//结构体
typedef struct xLIST
{
UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1)
ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
} List_t
将节点插入到链表尾部
//操作Lise_t和ListItem_t结构体
//将节点插入到链表的尾部 //List_t根节点
void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem )
{
ListItem_t * const pxIndex = pxList->pxIndex;
pxNewListItem->pxNext = pxIndex; //(1)
pxNewListItem->pxPrevious = pxIndex->pxPrevious; //(2)
pxIndex->pxPrevious->pxNext = pxNewListItem; //(3)
pxIndex->pxPrevious = pxNewListItem; //(4)
/* 记住该节点所在的链表 */
pxNewListItem->pvContainer = ( void * ) pxList; //(5)
/* 链表节点计数器++ */
( pxList->uxNumberOfItems )++; //(6)
}
//结构体
typedef struct xLIST
{
UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1)
ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
} List_t
//===============================================================
struct xLIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ (1)
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ (2)
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ (3)
void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB */(4)
void * pvContainer; /* 指向该节点所在的链表 */ (5)
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ (6)
将节点按照升序排列插入到链表
//将节点按照升序排列插入到链表
void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem )
{
ListItem_t *pxIterator;
/* 获取节点的排序辅助值 */
const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; (1)
/* 寻找节点要插入的位置 */ (2)
if ( xValueOfInsertion == portMAX_DELAY )
{
pxIterator = pxList->xListEnd.pxPrevious;
}
else
{
for ( pxIterator = ( ListItem_t * ) &( pxList->xListEnd );
pxIterator->pxNext->xItemValue <= xValueOfInsertion;
pxIterator = pxIterator->pxNext )
{
/* 没有事情可做,不断迭代只为了找到节点要插入的位置 */
}
}
/* 根据升序排列,将节点插入 */ (3)
pxNewListItem->pxNext = pxIterator->pxNext; ①
pxNewListItem->pxNext->pxPrevious = pxNewListItem; ②
pxNewListItem->pxPrevious = pxIterator; ③
pxIterator->pxNext = pxNewListItem; ④
/* 记住该节点所在的链表 */
pxNewListItem->pvContainer = ( void * ) pxList; ⑤
/* 链表节点计数器++ */
( pxList->uxNumberOfItems )++; ⑥
}
//结构体
typedef struct xLIST
{
UBaseType_t uxNumberOfItems; /* 链表节点计数器 */ (1)
ListItem_t * pxIndex; /* 链表节点索引指针 */ (2)
MiniListItem_t xListEnd; /* 链表最后一个节点 */ (3)
} List_t
//===============================================================
struct xLIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ (1)
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ (2)
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ (3)
void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB */(4)
void * pvContainer; /* 指向该节点所在的链表 */ (5)
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ (6)
将节点从列表删除
//将节点从链表删除
UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
{
/* 获取节点所在的链表 */
List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
/* 将指定的节点从链表删除*/
pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; ①
pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; ②
/*调整链表的节点索引指针 */
if ( pxList->pxIndex == pxItemToRemove )
{
pxList->pxIndex = pxItemToRemove->pxPrevious;
}
/* 初始化该节点所在的链表为空,表示节点还没有插入任何链表 */
pxItemToRemove->pvContainer = NULL; ③
/* 链表节点计数器-- */
( pxList->uxNumberOfItems )--; ④
/* 返回链表中剩余节点的个数 */
return pxList->uxNumberOfItems;
}
//结构体
struct xLIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ (1)
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ (2)
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ (3)
void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB */(4)
void * pvContainer; /* 指向该节点所在的链表 */ (5)
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ (6)
任务控制块
//tasks.c
//复制自FreeRTOS库,删减了一些定义
/*
*任务控制块。为每个任务分配一个任务控制块(TCB),
*并存储任务状态信息,包括指向任务上下文的指针
*(任务的运行时环境,包括寄存器值)
*/
typedef struct tskTaskControlBlock /*旧的命名约定用于防止破坏支持内核的调试器*/
{
volatile StackType_t * pxTopOfStack; //(1) /*<当前堆栈的栈顶,必须位于结构体的第一项 */
ListItem_t xStateListItem; //(2) /*< 任务的状态列表项所引用的列表表示该任务的状态(就绪、已阻止、已暂停) */
//-----------------------------------------------------------
struct xLIST_ITEM
{
TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */// (1)
struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ //(2)
struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ //(3)
void * pvOwner; /* 指向拥有该节点的内核对象,通常是 TCB *///(4)
void * pvContainer; /* 指向该节点所在的链表 */ //(5)
};
typedef struct xLIST_ITEM ListItem_t; /* 节点数据类型重定义 */ //(6)
//-----------------------------------------------------------
ListItem_t xEventListItem; /*< 事件列表项,用于将任务以引用的方式挂接到事件列表 */
UBaseType_t uxPriority; /*< 任务的优先级。0是最低优先级*/
StackType_t * pxStack; //(3) /*< 指向堆栈的起始 */
char pcTaskName[ configMAX_TASK_NAME_LEN ]; //(4) /*< 创建任务时为任务指定的描述性名称。仅用于调试。 */ /*lint !e971 仅允许字符串和单个字符使用非限定字符类型*/
} tskTCB;
typedef tskTCB TCB_t;
后续再更新!!