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