任务挂载函数
OSTaskSuspend(INT8U prio)具体功能:
①首先通过优先级参数对要挂起任务判断(每个任务对应不同的优先级)
②判断要挂起的任务是否是正在运行的任务
如果是:进行任务移除操作,将任务从就绪列表中移除
如果不是:说明该任务不需要不需要挂起,因为本身就处于非运行状态,何来挂起。
#if OS_TASK_SUSPEND_EN > 0u
INT8U OSTaskSuspend (INT8U prio) //挂起优先级即挂起任务,因为一个优先级对应一个任务
{
BOOLEAN self; //无符号整型,是否挂起标志位
OS_TCB *ptcb; //OS_TCB结构体指针
INT8U y; //整型变量
#if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
#endif
//优先级验证,
#if OS_ARG_CHK_EN > 0u
if (prio == OS_TASK_IDLE_PRIO) {//如果优先级等于空闲任务优先级,那就无需挂起,直接返回空闲挂起参数
return (OS_ERR_TASK_SUSPEND_IDLE);
}
if (prio >= OS_LOWEST_PRIO) { /* 优先级的值是否大于最低优先级的值 */
if (prio != OS_PRIO_SELF) {//如果不是挂起自己
return (OS_ERR_PRIO_INVALID);
}
}
#endif
OS_ENTER_CRITICAL();//关中断
if (prio == OS_PRIO_SELF) { /* 是否挂起自己 OS_PRIO_SELF为挂起函数优先级 */
prio = OSTCBCur->OSTCBPrio; //让优先级等于当前任务的优先级
self = OS_TRUE; //那就挂起标志位
} else if (prio == OSTCBCur->OSTCBPrio) { /*是否当前任务的优先级 */
self = OS_TRUE;//那就挂起
} else {
self = OS_FALSE; /* 那就不挂 ,因为不是当前任务 */
}
ptcb = OSTCBPrioTbl[prio];//该被挂起任务优先级列表的地址
if (ptcb == (OS_TCB *)0) {/* 被挂起的任务是否存在 */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_SUSPEND_PRIO); //返回挂起错误
}
if (ptcb == OS_TCB_RESERVED) {/* 是否分配给了 Mutex */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_NOT_EXIST);
}
/* 优先级位图法,将任务移除就序列表 */
y = ptcb->OSTCBY;
OSRdyTbl[y] &= (OS_PRIO)~ptcb->OSTCBBitX;
if (OSRdyTbl[y] == 0u) {
OSRdyGrp &= (OS_PRIO)~ptcb->OSTCBBitY;
}
ptcb->OSTCBStat |= OS_STAT_SUSPEND;/* 任务由运行状态变成挂起状态 */
OS_EXIT_CRITICAL();
if (self == OS_TRUE) { /* Context switch only if SELF */
OS_Sched(); /* 只有挂起该任务才能重新调度 */
}
return (OS_ERR_NONE);
}
#endif