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
- UC/OS基础知识之任务的挂起和恢复
- uC /OS-II中任务的挂起和恢复
- uc/os-ii任务的挂起与恢复
- UC/OS基础知识之任务的创建
- UC/OS基础知识之任务的删除
- uC/OS-III之任务挂起表
- UC/OS基础知识之任务
- uC/OS-II 学习笔记之:任务挂起与恢复,调度器上锁与解锁!
- UC/OS-II基础知识之任务的同步与事件
- UC/OS基础知识之任务堆栈
- UC/OS基础知识之任务控制块
- UC/OS基础知识之任务就绪表
- UC/OS II 任务管理(5)之任务删除、阻塞和恢复
- FreeRTOS之任务挂起和恢复函数
- 任务挂起和恢复
- 任务的创建、挂起和恢复
- uC/OS-II 学习笔记之:任务的优先级别和任务数
- uC/OS之任务优先级
- C++11新特性应用--实现延时求值(std::function和std::bind)
- python 装饰器
- 对js运算符“||”
- Spring AOP 详解
- [unity移植android]Unable to instantiate activity ComponentInfo
- UC/OS基础知识之任务的挂起和恢复
- 让程序在崩溃时体面的退出之总结
- POJ 2184 Cow Exhibition(01背包变形 or dfs+剪枝)
- 数组
- 换个新地方
- mongodb 报错 Error: Cannot find module '../build/Release/bson'解决办法
- 基于ATmega16单片机 程控滤波器程序源代码
- java插入内容进入oracle的clob字段
- 【UML类图】设计模式中类的关系(一)