ucos操作系统之任务挂载函数解析

任务挂载函数

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值