对OS_FlagUnlink()代码的简化

3 篇文章 0 订阅

我在学习ucos-ii代码的时候发现OS_FlagUnlink()代码有一段可以简化。

但是作者没有简化,网上也没找到有人讨论这段代码,有点奇怪。怀疑是不是我想的简化有问题,发出来希望有人讨论下。

原OS_FlagUnlink()函数(os_flag.c)

void  OS_FlagUnlink (OS_FLAG_NODE *pnode)
{
#if OS_TASK_DEL_EN > 0
    OS_TCB       *ptcb;
#endif
    OS_FLAG_GRP  *pgrp;
    OS_FLAG_NODE *pnode_prev;
    OS_FLAG_NODE *pnode_next;


    pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
    pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
    if (pnode_prev == (OS_FLAG_NODE *)0) {                      /* Is it first node in wait list?      */
        pgrp                 = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
         /*      Update list for new 1st node   */
        pgrp->OSFlagWaitList = (void *)pnode_next;             
        if (pnode_next != (OS_FLAG_NODE *)0) {
            /*      Link new 1st node PREV to NULL */
            pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0;     
        }
    } else {                                                    /* No,  A node somewhere in the list   */
        /*      Link around the node to unlink */
        pnode_prev->OSFlagNodeNext = pnode_next;    
	/*      Was this the LAST node?        */
        if (pnode_next != (OS_FLAG_NODE *)0) {             
            /*      No, Link around current node   */
            pnode_next->OSFlagNodePrev = pnode_prev;            
        }
    }
#if OS_TASK_DEL_EN > 0
    ptcb                = (OS_TCB *)pnode->OSFlagNodeTCB;
    ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
#endif
}

被我简化后的函数代码

void  OS_FlagUnlink (OS_FLAG_NODE *pnode)
{
#if OS_TASK_DEL_EN > 0
    OS_TCB       *ptcb;
#endif
    OS_FLAG_GRP  *pgrp;
    OS_FLAG_NODE *pnode_prev;
    OS_FLAG_NODE *pnode_next;


    pnode_prev = (OS_FLAG_NODE *)pnode->OSFlagNodePrev;
    pnode_next = (OS_FLAG_NODE *)pnode->OSFlagNodeNext;
    if (pnode_prev == (OS_FLAG_NODE *)0) {                      /* Is it first node in wait list?      */
        pgrp                 = (OS_FLAG_GRP *)pnode->OSFlagNodeFlagGrp;
         /*      Update list for new 1st node   */
        pgrp->OSFlagWaitList = (void *)pnode_next;             
    } else {                                                    /* No,  A node somewhere in the list   */
        /*      Link around the node to unlink */
        pnode_prev->OSFlagNodeNext = pnode_next;                
    }

    if (pnode_next != (OS_FLAG_NODE *)0) {                  /*      Was this the LAST node?        */
        /*      No, Link around current node   */
        pnode_next->OSFlagNodePrev = pnode_prev;            
    }	
#if OS_TASK_DEL_EN > 0
    ptcb                = (OS_TCB *)pnode->OSFlagNodeTCB;
    ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0;
#endif
}

主要是把下面的代码从if和else里提取出来。

    if (pnode_next != (OS_FLAG_NODE *)0) {                  /*      Was this the LAST node?        */
        /*      No, Link around current node   */
        pnode_next->OSFlagNodePrev = pnode_prev;            
    }

因为

if (pnode_prev == (OS_FLAG_NODE *)0) {						/* Is it first node in wait list?	   */
	    /*      Link new 1st node PREV to NULL */
            pnode_next->OSFlagNodePrev = (OS_FLAG_NODE *)0;   

	/*		No, Link around current node   */
	pnode_next->OSFlagNodePrev = pnode_prev;	

效果是一样的。
uCOS-II-V290版本的代码就是原OS_FlagUnlink()代码一样的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值