ajiejie 发表于 2017-7-24 21:15:32

UCOS中OSTaskDel函数的疑问

INT8UOSTaskDel (INT8U prio) reentrant
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register         */
    OS_CPU_SR   cpu_sr;
#endif

#if OS_EVENT_EN > 0
    OS_EVENT   *pevent;
#endif   
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
    OS_FLAG_NODE *pnode;
#endif
    OS_TCB       *ptcb;



    if (OSIntNesting > 0) {                                     /* See if trying to delete from ISR    */
      return (OS_TASK_DEL_ISR);
    }
#if OS_ARG_CHK_EN > 0
    if (prio == OS_IDLE_PRIO) {                                 /* Not allowed to delete idle task   */
      return (OS_TASK_DEL_IDLE);
    }
    if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {       /* Task priority valid ?               */
      return (OS_PRIO_INVALID);
    }
#endif
    OS_ENTER_CRITICAL();
    if (prio == OS_PRIO_SELF) {                                 /* See if requesting to delete self    */
      prio = OSTCBCur->OSTCBPrio;                           /* Set priority to delete to current   */
    }
    if ((ptcb = OSTCBPrioTbl) != (OS_TCB *)0) {                /* Task to delete must exist      */
      if ((OSRdyTbl &= ~ptcb->OSTCBBitX) == 0x00) {/* Make task not ready            */
            OSRdyGrp &= ~ptcb->OSTCBBitY;
      }
#if OS_EVENT_EN > 0
      pevent = ptcb->OSTCBEventPtr;
      if (pevent != (OS_EVENT *)0) {                        /* If task is waiting on event         */
            if ((pevent->OSEventTbl &= ~ptcb->OSTCBBitX) == 0) { /* ... remove task from */
                pevent->OSEventGrp &= ~ptcb->OSTCBBitY;                        /* ... event ctrl block */
            }
      }
#endif
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
      pnode = ptcb->OSTCBFlagNode;
      if (pnode != (OS_FLAG_NODE *)0) {                     /* If task is waiting on event flag    */
            OS_FlagUnlink(pnode);                               /* Remove from wait list               */
      }
#endif
      ptcb->OSTCBDly= 0;                                    /* Prevent OSTimeTick() from updating*/
      ptcb->OSTCBStat = OS_STAT_RDY;                        /* Prevent task from being resumed   */
                if (OSLockNesting < 255) {
            OSLockNesting++;
                }
      OS_EXIT_CRITICAL();                                     /* Enabling INT. ignores next instruc. */
      OS_Dummy();                                             /* ... Dummy ensures that INTs will be */
      OS_ENTER_CRITICAL();                                    /* ... disabled HERE!                  */
                if (OSLockNesting > 0) {
            OSLockNesting--;
                }
      OSTaskDelHook(ptcb);                                    /* Call user defined hook            */
      OSTaskCtr--;                                          /* One less task being managed         */
      OSTCBPrioTbl = (OS_TCB *)0;                     /* Clear old priority entry            */
      if (ptcb->OSTCBPrev == (OS_TCB *)0) {                   /* Remove from TCB chain               */
            ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *)0;
            OSTCBList                  = ptcb->OSTCBNext;
      } else {
            ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
            ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
      }
      ptcb->OSTCBNext = OSTCBFreeList;                        /* Return TCB to free TCB list         */
      OSTCBFreeList   = ptcb;
      OS_EXIT_CRITICAL();
      OS_Sched();                                             /* Find new highest priority task      */
      return (OS_NO_ERR);             ========================================================================>>OS_Sched()如果检测到更高优先级的就绪任务,该语句岂不是不能返回了?
    }
    OS_EXIT_CRITICAL();
    return (OS_TASK_DEL_ERR);
}
页: [1]
查看完整版本: UCOS中OSTaskDel函数的疑问