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

        


    
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值