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; //节点所在的链表

相关推荐
无敌昊哥战神34 分钟前
深入理解 C 语言:巧妙利用“0地址”手写 offsetof 宏与内存对齐机制
c语言·数据结构·算法
XH华1 小时前
数据结构第九章:树的学习(下)
数据结构·学习
会编程的土豆3 小时前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
songyuc4 小时前
BM2『链表内指定区间反转』学习笔记
学习·链表
摸个小yu5 小时前
【力扣LeetCode热题h100】链表、二叉树
算法·leetcode·链表
汀、人工智能5 小时前
[特殊字符] 第93课:太平洋大西洋水流问题
数据结构·算法·数据库架构·图论·bfs·太平洋大西洋水流问题
feng_you_ying_li6 小时前
C++11,{}的初始化情况与左右值及其引用
开发语言·数据结构·c++
锅挤6 小时前
数据结构复习(第一章):绪论
数据结构·算法
汀、人工智能6 小时前
[特殊字符] 第95课:冗余连接
数据结构·算法·链表·数据库架构··冗余连接