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