OSFlagUnlink() 코드 단순화

3597 단어 ucosOS_FlagUnlink
제가 ucos-ii 코드를 공부하다가 OS 를 발견했어요.FlagUnlink() 코드는 단순화할 수 있습니다.
그러나 저자가 간소화하지 않았고 인터넷에서도 이 코드를 논의하는 사람을 찾지 못해 이상하다.내가 생각한 간소화에 문제가 있는지 의심하고 누군가가 토론해 주기를 바란다.
원래 OSFlagUnlink() 함수(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 버전 코드는 원래 OSFlagUnlink() 코드와 같습니다.

좋은 웹페이지 즐겨찾기