您的位置:首页 > 其它

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

2016-01-05 22:56 525 查看

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

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



1.任务的挂起

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

#if OS_TASK_SUSPEND_EN > 0
INT8U  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


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: