分享

任务挂起函数(OSTaskSuspend()) ucoc2任务管理

 xuhex 2012-02-15
任务挂起函数(OSTaskSuspend()) ucoc2任务管理
2009-07-14 17:02

#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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多