#if OS_TASK_SUSPEND_EN > 0
INT8U OSTaskSuspend (INT8U prio)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
BOOLEAN self;
OS_TCB *ptcb; //ptcb保存prio的任务控制块
#if OS_ARG_CHK_EN > 0
if (prio == OS_IDLE_PRIO) { //不能将空闲任务挂起
return (OS_TASK_SUSPEND_IDLE);
}
if (prio >= OS_LOWEST_PRIO && prio != OS_PRIO_SELF) { //判断优先级的有效性
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
//如果挂起任务自身,获得当前任务的优先级
if (prio == OS_PRIO_SELF) {
prio = OSTCBCur->OSTCBPrio;
self = TRUE;
//如果挂起的任务是当前正在运行的任务,也即要挂起任务自身
} else if (prio == OSTCBCur->OSTCBPrio) {
self = TRUE;
} else {
self = FALSE;
}
//ptcb获得要删除的任务控制块,如果删除的任务为空,则返回OS_TASK_SUSPEND_PRIO
if ((ptcb = OSTCBPrioTbl[prio]) == (OS_TCB *)0) {
OS_EXIT_CRITICAL();
return (OS_TASK_SUSPEND_PRIO);
}
//从就绪表中将该任务删除,即修改OSRdyTbl[]和OSRdyGrp的值
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
ptcb->OSTCBStat |= OS_STAT_SUSPEND; //将当前任务的状态设置为OS_STAT_SUSPEND
OS_EXIT_CRITICAL();
if (self == TRUE) { //如果正在执行任务挂起自身,则需要进行任务调度,获得优先级最高任务
OS_Sched();
}
return (OS_NO_ERR);
}
#endif