互斥信号量
  操作系统中利用信号量解决进程间的同步和互斥(互斥信号量)的问题,在多道程序环境下,操作系统就是遮掩实现进程之间的同步和互斥。但是在使用的过程中厉害的前辈还是发现了这一优秀机制的缺陷,它会导致优先级翻转从而出现系统部分功能瘫痪严重则会导致系统崩溃,互斥信号量的出现是为了解决优先级反转的问题的。根据互斥信号量的数据结构可以看出来互斥信号量和多值信号量在相关函数的操作是很相似的。

其中互斥信号量三个特有的不同变量的含义分别是:

1.OwnerTCBPtr

 这个元素记录了某时间段内唯一拥有互斥信号量的任务控制块指针 

2.OwnerOriginalPrio

 在任务等待互斥信号量时系统会调整拥有互斥信号量任务的优先级避免优先级反转,而这个变量就是保存优先级调整之前的优先级数,用于优先级还原

3.OwnerNestingCtr

 任务不仅可以占用互斥信号量还可以嵌套占用,每次占用就把这个值加1,当这个值为0时才说明当前任务使用完了信号量

优先级反转:

  优先级反转在可剥夺内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果。如下图(图片来源:原子USOC教程)

  图中的三个任务的优先级分别是高(H) 中(M) 低(L),其中中等优先级任务不需要请求信号量,其他两个任务执行会请求同一块资源也就是同一个信号量。系统在运行时会有这种情形,最低优先级的任务L先请求信号量并且成功请求到开始运行了,此时高优先级任务H和M就绪并H优先级最高拿走了CPU使用权,但是H任务内请求信号量的地方因为任务L还没有执行完所以还没有释放信号量导致H任务被挂起,此时CPU使用权就“风水轮流转”的到M任务,M任务开始执行直到执行完成,然后L任务才的以继续执行直到完成并释放掉信号量,最后H任务才能继续执行。这个过程中任务设计时如果计划让H任务完成了一些处理工作后才能执行任务M但是,似乎并没有按设计的流程执行导致中优先级的任务先于高优先级的人任务执行了,这就称之为优先级反转,这种现象在实际使用很可能导致严重的问题。

对于互斥信号量同样的三个优先级的任务,但在高任务请求信号量时因为互斥信号量此时被低优先级的任务拥有,所以会将L任务优先级暂时提高的H的水平,此时就可以理解互斥信号量内保存原优先级的变量的作用了就是在释放信号量时还原原优先级的备份,此时执行的过程就是最低优先级的任务L的以继续运行,此时高优先级任务H和M都就绪,但是L任务此时的优先级高于M所以CPU使用权还在L,当L执行完成后释放掉信号量优先级也降回原来的级数,此时H任务和M任务同样处于就绪状态并H拿走了CPU使用权,此时CPU使用权就不会给中优先级M然后M任务最后执行。这样执行顺序就没有问题了。

在前面多值信号量上的基础上互斥信号量的相关操作相对就简单好理解了不少;

1,创建互斥信号量

  定义一个互斥信号量,然后调用创建互斥信号量,同样每个信号量都有一个等待队列,且由OS_PEND_LIST变量管理,TailPtr指向等待队列的最后一个,Head指向第一个如图的数据结构;互斥信号量加入了信号量的拥有者来标记信号的当前拥有着任务。这点和多值信号量相同。

OSMutexCreate ()

2,请求信号量此时如果已经有低优先级的任务占有信号量要进行优先级的提升操作,提升了优先级也需要修改等待队列因为这个队列是按照优先级高低排序的,同时要是任务处于就绪状态也需要修改就绪列表里的顺序原因同上。

OSMutexPend ()

3,发布信号量

这里由于互斥信号量的属性决定的,互斥信号量的发布函数调用任务须先拥有互斥信号量。

OSMutexPost ()

其中的详细操作函数在多值信号量就已经见过了就是同多值信号量一样。

4,接下来就是一些强制解除等待,删除信号量函数等相关的函数了。这些函数其实就是对等待队列的一些修改函数和互斥信号量的整体原理关系不是十分紧密。

强制解除等待

OSMutexPendAbort ()

注意解除等待和删除函数的区别就是没有优先级继承恢复的相关操作,这个暂时还没有理解为什么。

删除信号量

OSMutexDel ()

这里主要区别一下多值信号量的相关操作的不同就可以,其基本的操作及原理都和多值信号量类似多了的部分就是其特点,也是其操作和多值信号量的不同点。

μC/OS-III---I笔记6---互斥信号量的更多相关文章

  1. FreeRTOS 二值信号量,互斥信号量,递归互斥信号量

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节讲解 FreeRTOS 任务间的同步和资源共享机制,二值信号量. 二值信号量是计数信号量的一种特殊形式 ...

  2. 基于μC/OS—III的CC1120驱动程序设计

    基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120   嵌入式操作系统   STM32F103ZE   ...

  3. 嵌入式系统FreeRTOS — 互斥信号量

    互斥信号量可以在资源保护的时候很有帮助.用于控制在两个或多个任务间访问共享资源.任务1里面用互斥,那么任务2只能等任务1访问完再访问同一个变量. 比如全局变量double gADC_value[CH_ ...

  4. ucos互斥信号量解决优先级反转问题

    在可剥夺性的内核中,当任务以独占方式使用共享资源的时候,会出现低优先级任务高于高优先级任务运行的情况,这种情况叫做优先级反转,对于实时操作系统而言,这是一场灾难,下面我们来说说优先级反转的典型环境. ...

  5. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  6. Linux 驱动——Button驱动6(mutex、NBLOCK、O_NONBLOCK)互斥信号量、阻塞、非阻塞

    button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...

  7. ucos之互斥信号量及优先级反转

    在ucos常使用共享资源来作为任务之间的通信方式,其中有:消息队列,信号量,邮箱,事件.信号量中又分二值信号,多值信号,互斥信号.这次主要讲二值信号与互斥信号之间区别和使用. 首先了解一下ucos的任 ...

  8. 【iCore4 双核心板_uC/OS-II】例程七:互斥信号量

    一.实验说明: 在介绍互斥信号量前,我们先简单地描述一下什么是优先级反转.使用实时内核心,优先级反转问题是实时系统中出现得最多的问题.假设任务H优先级高于任务M,任务M优先级高于任务L.任务H和任务M ...

  9. RTX——第15章 互斥信号量

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节开始讲解 RTX 的另一个重要的资源共享机制---互斥信号量(Mutex,即 Mutual Exc ...

  10. FreeRTOS互斥信号量

    API函数 #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) #define xSemaphoreCreateMutex() xQueueCreateMutex ...

随机推荐

  1. HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端

    HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端 发表时间:2020-03-05 1 ...

  2. 每天学一点 Vue3(一) CND方式的安装以及简单使用

    简介 感觉vue3的新特性很舒服,这样才是写软件的感觉嘛.打算用Vue实现自己的一些想法. Vue3还有几个必备库,比如Vue-Router(负责路由导航).Vuex(状态管理.组件间通信),还有第三 ...

  3. 微服务中台落地 中台误区 当中台遇上DDD,我们该如何设计微服务

    小结: 1. 微服务中台不是 /1堆砌技术组件就是中台 /2拥有服务治理就是中台 /3增加部分业务功能就是中台 /4Cloud Native 就是中台 https://mp.weixin.qq.com ...

  4. .params和query的区别

    用法:query要用path来引入,params要用name来引入,接收参数都是类似的,分别是this.$route.query.name和this.$route.params.name.url地址显 ...

  5. LOJ2723

    LOJ2723 Get Luffy Out 题目大意:给你n对钥匙,每对钥匙只可以用其中的任意一个,钥匙有编号,且不重复.有m个大门,每个门上有两个锁,每个锁对应一个编号的钥匙,只要打开两个锁中的一个 ...

  6. XCTF-easydex

    前期工作 查壳,无.安装打开黑屏. 逆向分析 用jadx打开看看 什么都没有,但可以看一下AndroidManifest 可以看到这个是个纯C/C++写的,没有Java代码,是个NativeActiv ...

  7. Spring Boot构建 RESTful 风格应用

    Spring Boot构建 RESTful 风格应用 1.Spring Boot构建 RESTful 风格应用 1.1 实战 1.1.1 创建工程 1.1.2 构建实体类 1.1.4 查询定制 1.1 ...

  8. Java中的异常处理机制《》

    异常机制已经成为判断一门编程语言是否成熟的标准,异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性. Java异常机制主要依赖于try.catch.finall ...

  9. Horde Groupware Webmail Edition 远程命令执行

    saturn:~ mr_me$ ./poc.py (+) usage ./poc.py <target> <path> <user:pass> <connec ...

  10. 6. Linux输入输出重定向

    1.输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中. 输入重定向中用到的符号及其作用 输出重定向中用到的符号及其作用 1)通过输出重定向将原本要输出到 ...