{
OS_ENTER_CRITICAL(); //进入临界区0
if (prio == OS_PRIO_SELF)//如果调用该函数时使用0XFF表示当前任务
{ //就获取当前任务的优先级
prio = OSTCBCur->OSTCBPrio;
}
ptcb = OSTCBPrioTbl[prio];
if (ptcb != (OS_TCB *) 0) //判断删除的任务是否存在
{
//取消当前删除的任务在就绪表中的登记
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00)
{
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
ptcb->OSTCBDly = 0; //设置等待时间为0,防止系统时钟中断更新此值
ptcb->OSTCBStat = OS_STAT_RDY;//设置状态为OS_STAT_RDY,防止此任务再次回复执行
//调度器加锁
if (OSLockNesting < 255)
{
OSLockNesting++;//任务调度锁定次数加1
} //(上锁的任务是可以中断)
OS_EXIT_CRITICAL();//退出临界区0
OS_Dummy(); //该函数相当于NOP指令,空执行,等待一个时间周期
//在部分CPU中规定,中断开启后必须这样至少执行一个周期
//如果开启中断后立即关闭将可能导致中断关闭无效
OS_ENTER_CRITICAL();//进入临界区1
//调度器解锁
if (OSLockNesting > 0)
{
OSLockNesting--;//任务调度锁定次数减1
}
OSTaskCtr--; //任务数减1
OSTCBPrioTbl[prio] = (OS_TCB *) 0; //清除该任务的TCB相关项
if (ptcb->OSTCBPrev == (OS_TCB *) 0)//判断是否位于当前任务TCB位于链头
{
ptcb->OSTCBNext->OSTCBPrev = (OS_TCB *) 0;//从TCB链中删除当前任务的TCB
OSTCBList = ptcb->OSTCBNext;
}
else//当前任务TCB不在链表头
{
ptcb->OSTCBPrev->OSTCBNext = ptcb->OSTCBNext;
ptcb->OSTCBNext->OSTCBPrev = ptcb->OSTCBPrev;
}
ptcb->OSTCBNext = OSTCBFreeList;//将删除任务的TCB添加到空闲TCB链表中
OSTCBFreeList = ptcb; //
OS_EXIT_CRITICAL(); //退出临界区1
OS_Sched(); //从就绪表中找出最高优先级并执行对应的代码段
return (OS_NO_ERR); //如果调度器上锁,就执行该语句
}
OS_EXIT_CRITICAL();//退出临界区0
return (OS_TASK_DEL_ERR);//删除的任务不存在,返回错误信息
}