野火电子论坛

 找回密码
 注册

扫一扫,访问微社区

查看: 19|回复: 0

关于列表带参宏 listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )的看法

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

最近头脑发热,突然又看了一下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视频快快更新



888888888c7.jpg
99999.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

野火电子公众号

手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号-2 大学生ARM嵌入式2群

GMT+8, 2020-3-29 01:07 , Processed in 0.077402 second(s), 32 queries , Gzip On.

野火电子论坛

© 2014-2016 www.firebbs.cn

快速回复 返回顶部 返回列表