關於freeRTOS 中 List 列表項插入操作的解讀


 

 

學習 freeRTOS 源碼時,不可避免的要和列表和列表項打交道,在這里解讀一下關於列表項的插入操作:

 

源代碼文件為 list.c 中的 void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) 函數:

 

/*-- 循環找出 pxNewListItem 列表項插入的位置,按照升序排列,--*/
        for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )
        {
            /* There is nothing to do here, just iterating to the wanted
            insertion position. */
        }
    }
 
    /*--插入列表項的位置被找到,也就是在 pxIterator 列表項和 pxIterator->pxNext 這兩個列表項中間插入新列表項 pxNewListItem --*/
    
    /*-- 1: 首先把 pxIterator->pxNext 賦值給 pxNewListItem->pxNext,讓新列表項指向原本列表中下一個列表項
             2: 把 pxNewListItem->pxNext(也就是原本列表中下一個列表項)的 pxNewListItem->pxNext->pxPrevious 成員指向待插入列表項 pxNewListItem,實現雙向鏈表
              
            (1、2兩步驟完成了待插入列表 pxNewListItem 與插入位置的下一個列表項( pxIterator->pxNext )的關聯操作)
    
           3: 把新列表項 pxNewListItem->pxPrevious    成員指向 pxIterator
             4: 最后把 pxIterator->pxNext 指向新列表項 pxNewListItem
            
            (3、4兩步驟完成了待插入列表項 pxNewListItem 與插入位置的前一個列表項 pxIterator 的關聯操作)
             
             5:經過以上步驟新列表項插入完成,如果你不想多定義一個變量,則步驟1必須首先執行,步驟2、3、4
    --*/
    pxNewListItem->pxNext = pxIterator->pxNext;
    pxNewListItem->pxNext->pxPrevious = pxNewListItem;
    pxNewListItem->pxPrevious = pxIterator;
    pxIterator->pxNext = pxNewListItem;

    /* Remember which list the item is in.  This allows fast removal of the
    item later. 
    更新新列表的所屬列表 */
    pxNewListItem->pvContainer = ( void * ) pxList;

    /*-- 列表內成員加1 --*/
    ( pxList->uxNumberOfItems )++;

以上是關於插入列表項的全部解讀。用中文都注釋好了

 

**:關於列表項的排序是根據列表項值的大小按升序排列。

**:本人的簡單總結:列表的本體是列表項,列表項的本體是列表項值。

 2019-09-19    09:23:59


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM