挂起是一种主动行为,因此恢复也应该要主动完成;

阻塞,睡眠则是一种被动行为,是在等待事件或资源时任务的表现;

睡眠是一种半主动半被动的行为,到了某个时间点,被要求去睡觉,到了下一个确定时间点,自己主动起来继续工作。

三者的表现方式都是    对应的任务优先级从任务就绪表中清除,只不过实现方式不一样。

在μCOS-Ⅱ操作系统中,两者分别对应以下几种情形: 
            1.使用OSTaskSuspend()函数将任务挂起,即任务进入挂起状态;
            2.使用OSTimeDly()和OSTimeDlyHMSM()函数将任务延时,即任务进入睡眠状态;
            3.使用OSSemPend()函数等待事件时,即任务进入阻塞状态;

上述情形实现的方式分别如下:
1. 任务可以挂起本身,也可以挂起别的任务。
任务可以挂起本身:
通过指定OS_PRIO_SELF来挂起调用本函数的任务本身,即OSTaskSuspend(OS_PRIO_SELF);
通过指定当前运行任务的优先级来挂起调用本函数的任务本身,即OSTaskSuspend(OSTCBCur->OSTCBPrio);
这种情况下就需要进行任务调度程序。
挂起别的任务,那就不需要进行任务调度程序,因为挂起的任务肯定是比正在运行的任务的优先级低。
不管该任务是否在任务就绪表中(要被挂起的任务可能不在就绪表中,原因是:该任务可能是在      等待延时的期满     或者     等待事件的发生),都将对应的任务从任务就绪状态表中移除出去,然后在OS_TCB的OSTCBStat变量设置为OS_STAT_SUSPEND标志了。

2. 调用OSTimeDly()或者OSTimeDlyHMSM()函数会使操作系统将当前任务从任务就绪状态表中移除出去,对该任务控制块中的OSTCBDly进行赋值,任务进入睡眠状态。然后进行一次任务调度,并执行下一个优先级最高的就绪态任务。

3. OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
该函数允许用户定义一个最长等待时间timeout,这样可以避免该任务无休止地等待下去。如果timeout是一个大于 0 的值,将timeout赋值给OSTCBDly,那么该任务将一直等到信号有效或者等待超时 时;如果该参数值为 0,该任务将一直等待下去,直到信号有效。
OS_TCB的OSTCBStat变量设置为OS_STAT_SEM标志了。
OSEventTaskWait()函数将当前任务从任务就绪状态表中移除出去,然后任务一直等待事件,即任务进入阻塞状态


从上述情形恢复到就绪状态的措施如下:
1. 被挂起的任务只有通过调用OSTaskResume()函数才能恢复,通过清除OSTCBStat域中的OS_STAT_SUSPEND位来取消挂起的。至于这个时候该任务是否处于就绪态还需要确认OSTCBDly是否为0以及该任务是否还处于等待事件触发的状态,判断程序如下:
((OSTCBStat &= ~OS_STAT_SUSPEND) == OS_STAT_RDY) & (OSTCBDly == 0)
其中OS_STAT_RDY = 0x00 OS_STAT_SEM = 0x01  OS_STAT_MBOX = 0x02  OS_STAT_Q = 0X04
OS_STAT_SUSPEND = 0x08   OS_STAT_MUTEX  =  0x10 OS_STAT_FLAG = 0x20
若是都满足的话,那么就将任务从挂起状态变成就绪状态,不满足后面延时期满和等待事件两条件的话,就将任务从挂起状态变成睡眠状态或阻塞状态。

2.规定的时间期满或者通过调用OSTimeDlyResume(prio)函数取消了延时;
通过调用该函数和指定任务的优先级来使延时的任务不等待延时的期满而直接处于就绪态。
通过赋予OSTCBDly  0值,若任务此时没有被挂起,则就进入就绪态。判断程序如下
(OSTCBStat &= OS_STAT_SUSPEND) == OS_STAT_RDY,
在这里不会有等待事件这种状态了,因为等待事件和任务延时两者只能依次发生,不会同时出现的。

3.通过调用OSSEMPost(OS_EVENT *pevent)函数,释放一个信号量
OSEventTaskRdy()函数将当前等待该信号的任务列表中的优先级最高的任务移除出去,并且赋予OSTCBDly  0值,然后判断该任务是否被挂起,若任务此时没有被挂起,则就进入就绪态。判断程序如下:
OSTCBStat == OS_STAT_RDY
在这里不会有任务延时这种状态了,因为等待事件和任务延时两者只能依次发生,不会同时出现的。

操作系统中挂起、睡眠、阻塞的区别形象解释
故事:
你控制了一个雇工为你干活。你对雇工的控制是通过编程来实现的。
挂起的意思就是你对主动对雇工说:“你睡觉去吧,用着你的时候我主动去叫你,然后接着干活”。
睡眠的意思就是你主动对雇工说:“你睡觉去吧,某时某刻过来报到,然后接着干活”。
阻塞的意思就是,你发现你的雇工不知道在什么时候没经过你允许,自己睡觉呢,但是你不能怪雇工,肯定你这个雇主没注意,本来你让雇工扫地,结果扫帚被偷了或被邻居家借去了,你又没让雇工继续干别的活,他就只好睡觉了。至于扫帚回来后,雇工会不会知道,会不会继续干活,你不用担心,雇工一旦发现扫帚回来了,他就会自己去干活的。因为雇工受过良好的培训。这个培训机构就是操作系统。

μCOS-Ⅱ操作系统中的PEND(阻塞zuse)和SUSPEND(挂起)和SLEEP(睡眠)三种状态相关推荐

  1. 操作系统:进程的三种状态

    进程的三种状态 1.   就绪状态:进程获得了除了CPU之外的所有的必要资源,只要获得CPU就可以立即执行,此时的进程处于就绪态. 2.   运行状态:进程已经获得CPU,正在运行,在多处理其系统中, ...

  2. hibernate中的PO持久化对象及PO三种状态

    一,认识持久化对象PO: 在hibernate的应用程序中,每一个数据库中的表都对应一个持久化对象PO.PO可以看成是与数据库表相映射的java对象.最简单的PO对应数据库中某个表中的一条记录,多个记 ...

  3. Java中对象的三种状态

    转载自   Java中对象的三种状态 Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究. 状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可 ...

  4. java三态_Java中对象的三种状态

    Java中的对象的三种状态是和垃圾回收紧密相关的,因此有必要深究. 状态一:可触及态:从根节点开始,可以搜索到这个对象,也就是可以访问到这个对象,也有人将其称为可达状态. 状态二:可复活态:从根节点开 ...

  5. promise的三种状态_一.Promise中核心逻辑的实现

    首先看一下Promise代码: let promise =new Promise((resolve,reject)=>{resolve('成功');//reject('失败'); }) prom ...

  6. 5G/NR中RRC的三种状态(idle, active, inactive)

    一.RRC_INACTIVE 状态的引入 在RRC_INACTIVE mode引入前,LTE原来只有RRC_IDLE和RRC_CONNECTED两种RRC状态, R13之后,LTE RRC新引入了一个 ...

  7. 一家反欺诈公司的面试经历——3.hibernate中的session的三种状态

    hibernate中的对象有三种状态: 瞬时状态 (Transient),持久状态 (Persistent), 游离状态 1.瞬时状态 (Transient) 由 new 命令开辟内存空间的 Java ...

  8. Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;可以将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数

    Session操作过程中的pojo对象存在三种状态: 1)  瞬时态:该对象在数据库中没有对应的数据 2)  持久态:数据库中存在该对象对应的数据,同时操作该对象的Session也存在. 3)  游离 ...

  9. Stateflow中三种状态转移方式的区别(默认转移、外部转移、内部转移)

    文章目录 前言 一.让人头秃的自增循环 二.默认转移和内部转移的区别 三.抛弃during追求entry 总结 前言 Stateflow中有三种典型的状态转移方式:默认转移.外部转移.内部转移. 其中 ...

  10. linux中的进程有哪三种基本状态,Linux下的进程有哪三种状态?()

    1.R (TASK_RUNNING)状态,可执行状态. 只有在该状态的进程才可能在CPU上运行.而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CP ...

最新文章

  1. Win10-OpenCV双目相机开发
  2. 布尔类型和三目运算符
  3. boost::hana::flip用法的测试程序
  4. LeetCode 268 缺失数字
  5. 面向接口编程的优点_为什么我们要面向接口编程
  6. 熟悉linux运行环境,实验一 熟悉Ubuntu环境
  7. 报名倒计时 | 「TeaTalk」技术沙龙成都站再来袭!
  8. 使用脚本删除ios工程中未使用图片
  9. python入口文件_用Python作GIS之三:入口程序 - stargui.py
  10. Oracle中使用SQL语句修改字段类型
  11. Oracle 数据库用户表大小分析
  12. 【历史上的今天】8 月 31 日:人工智能起源;GPU诞生;Windows 98中文版来了
  13. 【笔记】vue2.0音乐app——音乐列表以及BetterScroll滚动效果
  14. APS系统六大要素是什么?企业导入APS(高级生产计划与排程)有哪些好处?
  15. android 页面边框设置
  16. 利用js本地读取excel文件
  17. 移动开发技术总结!字节大神强推千页PDF学习笔记,附超全教程文档
  18. python制作手机壁纸_用Python生成自己专属的手机春节壁纸
  19. matlab绘制erp波形图,eeglab教程系列(9)-绘制ERP图像
  20. 大型智慧校园系统源码 智慧班牌 智慧安防 家校互联 智慧校园小程序源码

热门文章

  1. 如何获取股票交易接口
  2. 中科探海的海底掩埋物三维实时成像声呐
  3. [转]不可不知的十部交响曲
  4. Linux下7z压缩解压软件区别
  5. Python实现简繁体转换,现在的人玩得老花了
  6. 扇贝单词与百词斩的竞品分析
  7. CentOS后门入侵检测工具
  8. chrome浏览器调试时阻止图片的加载
  9. .Net框架设计(Yanlz+Unity+XR+C#+.Net+框架+框架设计+设计模式+工具可视化+SOA+立钻哥哥+==)
  10. JS中every()和some()的对比使用丨蓄力计划