freertos双向链表的插入

uxTopReadyPriority = uxTopReadyPriority | (1UL<<pxNewTCB->uxPriority);

//listINSERT_END( &pxReadyTasksLists[pxNewTCB->uxPriority], &pxNewTCB->xStateListItem );

List_t *pxList_; //指向目标优先级的就绪任务列表 (通过TCB的优先级索引)

ListItem_t *pxListItem_; //是待插入的任务状态列表项 (来自TCB的xStateListItem)

pxList_ = &pxReadyTasksLists[pxNewTCB->uxPriority];

pxListItem_ = &pxNewTCB->xStateListItem;

ListItem_t * const pxIndex = pxList_->pxIndex; //是列表的遍历指针 (通常指向列表末尾)

/* Insert a new list item into ( pxList ), but rather than sort the list,

* makes the new list item the last item to be removed by a call to

* listGET_OWNER_OF_NEXT_ENTRY(). */

pxListItem_->pxNext = pxIndex; // 新项的next指向当前索引项

pxListItem_->pxPrevious = pxIndex->pxPrevious; // 新项的prev指向索引项的前驱

pxIndex->pxPrevious->pxNext = pxListItem_; // 前驱项的next指向新项

pxIndex->pxPrevious = pxListItem_; // 索引项的prev指向新项

//Remember which list the item is in.

pxListItem_->pxContainer = pxList_; //记录所属列表 (用于后续从列表移除)

pxList_->uxNumberOfItems++; //更新列表长度计数器

portSETUP_TCB(pxNewTCB);

// [原有节点] ↔ [pxIndex节点]

//形成环形链表结构:[原有节点] ↔ [新节点] ↔ [pxIndex节点]

// volatile UBaseType_t uxNumberOfItems = 0 //链表中元素的个数

// |<---- ListItem_t *pxIndex; //总是指向xListEnd节点,在链表尾部插入的时候,方便找到位置

//|-->|----> TickType_t xItemValue = portMAX_DELAY [MiniListItem_t xListEnd]

//|<-------- struct xLIST_ITEM *pxNext; //后继节点

//|<-------- struct xLIST_ITEM *pxPrevious; //前驱节点

//|------->volatile UBaseType_t uxNumberOfItems = 1 //链表中元素的个数

//| |<-----ListItem_t *pxIndex; //总是指向xListEnd节点,在链表尾部插入的时候,方便找到位置

//| |->|-->TickType_t xItemValue = portMAX_DELAY [MiniListItem_t xListEnd]

//| | struct xLIST_ITEM *pxNext; ----->| //后继节点

//| | struct xLIST_ITEM *pxPrevious; ----->| //前驱节点

//| | |

//| | TickType_t xItemValue; <-------------| //链表节点的值

//| |<--struct xLIST_ITEM *pxNext; //后继节点

//| |<--struct xLIST_ITEM *pxPrevious; //前驱节点

//| void * pvOwner; //保存私有数据

//|<------ struct xLIST *pxContainer; //节点所在的链表

//|------->volatile UBaseType_t uxNumberOfItems = 2 //链表中元素的个数

//| |<-----ListItem_t *pxIndex; //总是指向xListEnd节点,在链表尾部插入的时候,方便找到位置

//| |->|-->TickType_t xItemValue = portMAX_DELAY [MiniListItem_t xListEnd]

//| | struct xLIST_ITEM *pxNext; ---->| //后继节点

//| | struct xLIST_ITEM *pxPrevious;--|----->| //前驱节点

//| | | |

//| |-|-->TickType_t xItemValue; <--------| | //链表节点的值

//| | | struct xLIST_ITEM *pxNext; ----------->| //后继节点

//| | |<--struct xLIST_ITEM *pxPrevious; | //前驱节点

//| | | void * pvOwner; | //保存私有数据

//|<-|-|---struct xLIST *pxContainer; | //节点所在的链表

//| | | |

//| | | TickType_t xItemValue; <-------------| //链表节点的值

//| | |<--struct xLIST_ITEM *pxNext; //后继节点

//| |<----struct xLIST_ITEM *pxPrevious; //前驱节点

//| void * pvOwner; //保存私有数据

//|<------ struct xLIST *pxContainer; //节点所在的链表

相关推荐
学编程就要猛5 小时前
数据结构初阶:Java中的Stack和Queue
数据结构
是苏浙5 小时前
零基础入门C语言之C语言实现数据结构之顺序表
c语言·开发语言·数据结构
星释5 小时前
Rust 练习册 :Matching Brackets与栈数据结构
数据结构·算法·rust
逐步前行8 小时前
C数据结构--排序算法
c语言·数据结构·排序算法
_dindong9 小时前
笔试强训:Week-4
数据结构·c++·笔记·学习·算法·哈希算法·散列表
陌路2010 小时前
S12 简单排序算法--冒泡 选择 直接插入 希尔排序
数据结构·算法·排序算法
papership11 小时前
【入门级-算法-5、数值处理算法:高精度的乘法】
数据结构·算法
earthzhang202111 小时前
【1039】判断数正负
开发语言·数据结构·c++·算法·青少年编程
谈笑也风生11 小时前
只出现一次的数字 II(一)
数据结构·算法·leetcode
im_AMBER13 小时前
Leetcode 47
数据结构·c++·笔记·学习·算法·leetcode