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

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

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

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

在μ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. MySQL--5子查询与连接小结
  2. node-GetPOST
  3. React-Context
  4. 【《Objective-C基础教程 》笔记】(八)OC的基本事实和OC杂七杂八的疑问
  5. sublime配置python开发环境_win7 下搭建sublime的python开发环境的配置方法
  6. php大马免杀技巧 | bypass waf
  7. 如果你是壁纸控,高清图片这里找!
  8. 成为最差前端开发的10个建议,唉!传递负能量了
  9. protobuf android ndk,直接在Android NDK端使用tensorflow(不使用JAVA api)
  10. 我的firefox插件开发历程
  11. 插座断电提醒(测试阶段)
  12. hr 标签可选的属性(续) 和 img 标签介绍
  13. 【翻译】关于ADXL345连接指南
  14. Android UI简单美化
  15. 全球重力场模型数据下载
  16. 华为设备信息中心配置命令
  17. 一文弄懂Batch Norm / Layer Norm / Instance Norm / Group Norm 归一化方法
  18. php错误1064,求助,phpmyadmin导入sql文件提示1064错误
  19. 住房公积金专办员题库(含答案)
  20. java环境安装(java环境安装教程)

热门文章

  1. KDJ指标短线交易技巧(图解)
  2. namesilo域名注册教程
  3. 距离多普勒谱(RD谱)绘制方法及理解
  4. Linux下实现双机互信
  5. 计算机领域的世界之最,超级计算机神威·太湖之光世界最快(中国这五年的世界之最④)...
  6. zotero+PDF expert+坚果云+iPad
  7. java程序员面试笔试宝典4.1基本概念
  8. IKBC DC-108改装锂电池
  9. PTA实验4-1-3 找出最小值 (20分) 本题要求编写程序,找出给定一系列整数中的最小值。
  10. 实现发送Http请求的两种方法