uC/OS-II中与删除任务相关的函数有两个,删除任务函数OSTaskDel()
和请求删除任务函数OSTaskDelReq()
。
- 删除任务函数源码如下,主要工作:
- 判断参数的有效性
- 把要删除的任务从任务就绪表中删除
- 使被删除的任务不等待延时期满 ,不会被ISR置于就绪状态,
ptcb->OSTCBDly = 0;
- 使被删除的任务不被
OSTaskResume()
,激活 ptcb->OSTCBStat = OS_STAT_RDY;
- 从优先级列表中删除被删除的TCB,在双向链表中去掉被删除的TCB 。
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
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 ==