初中生
最后登录1970-1-1
在线时间 小时
注册时间2020-3-26
|
最近头脑发热,突然又看了一下FreeRTOS关于列表的源码,因为之前看火哥的教程上对这个带参宏中
的if条件也存在疑惑,当时没有看明白,今天不知道怎么了突然就看明白了,可能大家也都明白这个if条件的
作用了,但是想到很多人可能第一次看也会产生和我一样的疑问,所以赶紧贴上我对这个if条件作用的分析,
萌新第一次发帖,不懂排版,可能比较乱,请大佬们多包涵,哈哈哈哈哈哈~不说废话了,见下:
#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \
{ \
List_t * const pxConstList = ( pxList ); \
/* Increment the index to the next item and return the item, ensuring */ \
/* we don't return the marker used at the end of the list. */ \
( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \
if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \
{ \
( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \
} \
( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \
} 假设根节点下已经插入一个节点,它们之间的关系可以如图1所示,
在第一次调用listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )时,不执行if条件判断,
返回的就是节点中的pxOwner,此时( pxConstList )->pxIndex 指向节点,
第二次调用listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )时,
( pxConstList )->pxIndex->pxNext指向的是根节点下的xListEnd,
执行( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext后,
( pxConstList )->pxIndex 便指向了根节点下的xListEnd,这时,if条件成立,执行条件中的语句,
此时由于( pxConstList )->pxIndex 已经指向了根节点下的xListEnd
所以( pxConstList )->pxIndex->pxNext就相当于还是节点的地址,因此执行if条件中的语句后,
( pxConstList )->pxIndex 仍然指向节点,所以第二次调用这个宏后返回的仍然是节点的pvOwner。正如作者的注释所说的那样/* we don't return the marker used at the end of the list. */
就是防止返回xListEnd中的pxOwner,况且xListEnd只是一个Mini类型的节点。
好了,工继续码代码,最后再说一句:希望火哥Linux视频快快更新
|
-
-
|