// CODE_SECTION(OSTaskDel,".UserProgramCode") INT8U OSTaskDel( INT8U prio ) { #if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) OS_FLAG_NODE *pnode; #endif OS_TCB *ptcb; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr = 0; #endif if ( OSIntNesting > 0 ) /* See if trying to delete from ISR */ { return ( OS_ERR_TASK_DEL_ISR ); } if ( prio == OS_TASK_IDLE_PRIO ) /* Not allowed to delete idle task */ { return ( OS_ERR_TASK_DEL_IDLE ); } #if OS_ARG_CHK_EN > 0 if ( prio >= OS_LOWEST_PRIO ) /* Task priority valid ? */ { if ( prio != OS_PRIO_SELF ) { return ( OS_ERR_PRIO_INVALID ); } } #endif /*$PAGE*/ OS_ENTER_CRITICAL(); if ( prio == OS_PRIO_SELF ) /* See if requesting to delete self */ { prio = OSTCBCur->OSTCBPrio; /* Set priority to delete to current */ } ptcb = OSTCBPrioTbl[prio]; if ( ptcb == ( OS_TCB * )0 ) /* Task to delete must exist */ { OS_EXIT_CRITICAL(); return ( OS_ERR_TASK_NOT_EXIST ); } if ( ptcb == OS_TCB_RESERVED ) /* Must not be assigned to Mutex */ { OS_EXIT_CRITICAL(); return ( OS_ERR_TASK_DEL ); } OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX; if ( OSRdyTbl[ptcb->OSTCBY] == 0 ) /* Make task not ready */ { OSRdyGrp &= ~ptcb->OSTCBBitY; } #if (OS_EVENT_EN) if ( ptcb->OSTCBEventPtr != ( OS_EVENT * )0 ) { OS_EventTaskRemove( ptcb, ptcb->OSTCBEventPtr ); /* Remove this task from any event wait list */ } #if (OS_EVENT_MULTI_EN > 0) if ( ptcb->OSTCBEventMultiPtr != ( OS_EVENT ** )0 ) /* Remove this task from any events' wait lists*/ { OS_EventTaskRemoveMulti( ptcb, ptcb->OSTCBEventMultiPtr ); } #endif #endif #if (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 */ ptcb->OSTCBStatPend = OS_STAT_PEND_OK; if ( OSLockNesting < 255u ) /* Make sure we don't context switch */ { 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 ) /* Remove context switch lock */ { OSLockNesting--; } OSTaskDelHook( ptcb ); /* Call user defined hook */ OSTaskCtr--; /* One less task being managed */ OSTCBPrioTbl[prio] = ( 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; #if OS_TASK_NAME_SIZE > 1 ptcb->OSTCBTaskName[0] = '?'; /* Unknown name */ ptcb->OSTCBTaskName[1] = OS_ASCII_NUL; #endif OS_EXIT_CRITICAL(); if ( OSRunning == OS_TRUE ) { OS_Sched(); /* Find new highest priority task */ } return ( OS_ERR_NONE ); }
INT8U OSTaskDel (INT8U prio) { #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; BOOLEAN self; 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 */ } ptcb = OSTCBPrioTbl[prio]; if (ptcb != (OS_TCB *)0) { /* Task to delete must exist */ if ((OSRdyTbl[ptcb->OSTCBY] &= ~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->OSTCBY] &= ~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[prio] = (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_EXIT_CRITICAL(); return (OS_TASK_DEL_ERR); }