UC/OS基础知识之任务的挂起和恢复

来源:互联网 发布:微信全网发布封域名 编辑:程序博客网 时间:2024/05/19 15:44

UC/OS基础知识之任务的挂起和恢复

所谓挂起就是停止这个任务的运行。用户可以通过调用系统提供的OSTaskSuspend()函数来挂起除空闲任务之外的其他任务,只能在其他任务中调用恢复函数OSTaskResume()使其恢复为就绪状态。任务在运行,就绪状态和等待状态之间的转移关系如下图

1.任务的挂起
挂起任务函数OSTaskSuspend()如下所示

#if OS_TASK_SUSPEND_EN > 0INT8U  OSTaskSuspend (INT8U prio){    BOOLEAN    self;    OS_TCB    *ptcb;    INT8U      y;#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register           */    OS_CPU_SR  cpu_sr = 0;#endif#if OS_ARG_CHK_EN > 0    if (prio == OS_TASK_IDLE_PRIO) {                            /* Not allowed to suspend idle task    */        return (OS_TASK_SUSPEND_IDLE);    }    if (prio >= OS_LOWEST_PRIO) {                               /* Task priority valid ?               */        if (prio != OS_PRIO_SELF) {            return (OS_PRIO_INVALID);        }    }#endif    OS_ENTER_CRITICAL();    if (prio == OS_PRIO_SELF) { /* See if suspend SELF                */        prio = OSTCBCur->OSTCBPrio;        self = OS_TRUE;    } else if (prio == OSTCBCur->OSTCBPrio) {                   /* See if suspending self              */        self = OS_TRUE;    } else {        self = OS_FALSE;                                        /* No suspending another task          */    }    ptcb = OSTCBPrioTbl[prio];    if (ptcb == (OS_TCB *)0) {                                  /* Task to suspend must exist          */        OS_EXIT_CRITICAL();        return (OS_TASK_SUSPEND_PRIO);    }    if (ptcb == (OS_TCB *)1) {                                  /* See if assigned to Mutex            */        OS_EXIT_CRITICAL();        return (OS_TASK_NOT_EXIST);    }    y            = ptcb->OSTCBY;    OSRdyTbl[y] &= ~ptcb->OSTCBBitX;                            /* Make task not ready                 */    if (OSRdyTbl[y] == 0) {        OSRdyGrp &= ~ptcb->OSTCBBitY;    }    ptcb->OSTCBStat |= OS_STAT_SUSPEND;                         /* Status of task is 'SUSPENDED'       */    OS_EXIT_CRITICAL();    if (self == OS_TRUE) {                                      /* Context switch only if SELF         */        OS_Sched();    }    return (OS_NO_ERR);}#endif

任务挂起的流程图如下图所示

2.任务的恢复
任务恢复函数OSTaskResume()原型如下所示

INT8U  OSTaskResume (INT8U prio){    OS_TCB    *ptcb;#if OS_CRITICAL_METHOD == 3                                   /* Storage for CPU status register       */    OS_CPU_SR  cpu_sr = 0;#endif#if OS_ARG_CHK_EN > 0    if (prio >= OS_LOWEST_PRIO) {                             /* Make sure task priority is valid      */        return (OS_PRIO_INVALID);    }#endif    OS_ENTER_CRITICAL();    ptcb = OSTCBPrioTbl[prio];    if (ptcb == (OS_TCB *)0) {                                /* Task to suspend must exist            */        OS_EXIT_CRITICAL();        return (OS_TASK_RESUME_PRIO);    }    if (ptcb == (OS_TCB *)1) {                                /* See if assigned to Mutex              */        OS_EXIT_CRITICAL();        return (OS_TASK_NOT_EXIST);    }    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) != OS_STAT_RDY) { /* Task must be suspended                */        ptcb->OSTCBStat &= ~OS_STAT_SUSPEND;                  /* Remove suspension                     */        if (ptcb->OSTCBStat == OS_STAT_RDY) {                 /* See if task is now ready              */            if (ptcb->OSTCBDly == 0) {                OSRdyGrp               |= ptcb->OSTCBBitY;    /* Yes, Make task ready to run           */                OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;                OS_EXIT_CRITICAL();                OS_Sched();            } else {                OS_EXIT_CRITICAL();            }        } else {                                              /* Must be pending on event              */            OS_EXIT_CRITICAL();        }        return (OS_NO_ERR);    }    OS_EXIT_CRITICAL();    return (OS_TASK_NOT_SUSPENDED);}#endif

任务恢复的流程图如下图所示

0 1