学习 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

02-13 23:30