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
任务恢复的流程图如下图所示
相关文章推荐
- 基于python的密码管理工具
- [模拟炉石](三)使用卡牌
- Java大型网站架构演变史介绍
- point push
- MongoDB分片实战(一):集群搭建
- MAC上配置gradle
- 源码之Queue
- Study Method
- vnc介绍
- swift常用UI控件的使用方法
- 编程珠玑笔记~排序10^7个数
- Using Collocations to Learn English
- Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE Please check logcat output for more details.
- Android Adapter 数据源没有刷新
- 采用Dom4j及xpath解析xml文件
- Intonation and Speed of Speaking
- pthread_mutex的使用
- 三种基本排序算法-冒泡排序,选择排序,插入排序
- easypr车牌识别开源项目学习(三)
- 代理服务器与反向代理服务器的区别