1、列表项的删除:从列表中删除指定的列表项,通过uxListRemove()函数来完成
pxItemToRemove:要删除的列表项
uxListRemove:剩余列表项的数目
步骤:
- 获取列表项所在的列表地址将要删除的
- 列表项的前后两个列表项进行连接
- 索引是否需要更新
- 被删除列表项的成员变量pvContainer清零
- 列表项数量减一
- 返回当前列表的有效列表项数量
1 UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) 2 { 3 List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer; 4 5 pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; 6 pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; 7 /* Only used during decision coverage testing. */ 8 mtCOVERAGE_TEST_DELAY(); 9 10 if( pxList->pxIndex == pxItemToRemove ) 11 { 12 pxList->pxIndex = pxItemToRemove->pxPrevious; 13 } 14 else 15 { 16 mtCOVERAGE_TEST_MARKER(); 17 } 18 19 pxItemToRemove->pvContainer = NULL; 20 21 ( pxList->uxNumberOfItems )--; 22 23 return pxList->uxNumberOfItems; 24 }
2、 列表项的遍历
每调用一次这个函数,列表的pxIndex变量就会指向下一个列表项,并返回这个列表项的pvOwner变量值
pxTCB:用来保存pxIndex所指向的列表项的pvOwnerpxList:表示要遍历的列表
步骤:
- 首先获取当前列表
- 列表的pxIndex变量指向下一个列表项
- 如果pxIndex指向了列表的xListEnd成员变量,表示到了列表末尾
- 此时就跳过xListEnd,pxIndex再次指向列表头的列表项,这样就完成了一次列表遍历
- 获取当前pxIndex指向的所有者(其实就是任务控制块)
1 #define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) 2 { 3 List_t * const pxConstList = ( pxList ); 4 5 ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; 6 7 if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) 8 { 9 ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; 10 } 11 ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; 12 }
标签:遍历,删除,pxConstList,pxIndex,pxItemToRemove,列表,pxNext,pxList From: https://www.cnblogs.com/CC-C/p/17012193.html