当前位置: 首页 > news >正文

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

        



http://www.dtcms.com/a/290734.html

相关文章:

  • AI知识点——MCP
  • 如何使用终端查看任意Ubuntu的版本信息
  • 使用Langchain调用模型上下文协议 (MCP)服务
  • 中文分词模拟器 - 华为OD统一考试(Java 题解)
  • CS231n-2017 Lecture5神经网络笔记
  • 【Java EE初阶 --- 网络原理】应用层---HTTP(HTTPS)协议
  • 内网与外网是通过什么进行传输的?内外网文件传输的安全方法
  • Java从入门到精通 - 面向对象高级(三)
  • kafka 生产和消费 性能测试工具 kafka-producer-perf-test.sh kafka-consumer-perf-test.sh
  • kafka 生产消息和消费消息 kafka-console-producer.sh kafka-console-consumer.sh
  • Python 进阶(六): Word 基本操作
  • ROS 与 Ubuntu 版本的对应关系
  • 初学者STM32—USART
  • 了解类加载器吗?类加载器的类型有哪些?
  • Java 大视界 -- 基于 Java 的大数据分布式计算在地球物理勘探数据处理与地质结构建模中的应用(356)
  • 鹏鼎控股入职测评综合能力真题SHL测评题库2025年攻略
  • postgresql16.4 配置 数据库主从
  • PyTorch 实现 CIFAR-10 图像分类:从数据预处理到模型训练与评估
  • git bash命令不够完善,想整合msys2该怎么办?
  • 02-UE5蓝图初始的三个节点作用
  • 文娱投资的逆势突破:博派资本的文化旅游综合体战略
  • 阿里云宝塔Linux面板相关操作记录
  • 照片to谷歌地球/奥维地图新增功能:导出 GeoJSON 数据
  • 高级技术【Java】【反射】【注解】【动态代理】
  • c++:父类的析构函数定义为纯虚函数注意事项
  • “专属私有云”或“行业公有云(逻辑隔离的公共云专区)”两种主流部署模式到底有什么区别?政务云不就应该是专属的私有云么?政务云是不是不能混用?
  • 网络编程基础:从 OSI 模型到 TCP/IP 协议族的全面解析
  • 【AI高性能网络解析】第三期:数据快递,海量数据跨广域高效传输技术实践
  • 计算机网络:概述层---计算机网络的组成和功能
  • harbor镜像仓库由原来的v2.11.1版本升级到v2.13.1,数据不丢失