3任务的创建-列表项的删除&遍历

 1、列表项的删除:从列表中删除指定的列表项,通过uxListRemove()函数来完成

pxItemToRemove:要删除的列表项
uxListRemove:剩余列表项的数目
步骤:
  1. 获取列表项所在的列表地址将要删除的
  2. 列表项的前后两个列表项进行连接
  3. 索引是否需要更新
  4. 被删除列表项的成员变量pvContainer清零
  5. 列表项数量减一
  6. 返回当前列表的有效列表项数量
 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所指向的列表项的pvOwner
 pxList:表示要遍历的列表

步骤:

  1. 首先获取当前列表
  2. 列表的pxIndex变量指向下一个列表项
  3.  如果pxIndex指向了列表的xListEnd成员变量,表示到了列表末尾
  4. 此时就跳过xListEnd,pxIndex再次指向列表头的列表项,这样就完成了一次列表遍历 
  5. 获取当前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 }

 

 




 

posted @ 2022-12-30 18:44  Yoku  阅读(137)  评论(0)    收藏  举报