學習 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