OSFlagUnlink() 코드 단순화
3597 단어 ucosOS_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() 코드와 같습니다.