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

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

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. FLask的偏函数应用

    偏函数 实际上,偏函数主要辅助原函数,作用其实和原函数差不多,不同的是,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值.而偏函数便可简化这些操作,减少函数调用,主要是将一个或多个参数 ...

  2. k8s-jenkins持续发布tomcat项目

    k8s-jenkins持续发布tomcat项目 一.需求 这个实验前期后后搞了很久(公司经常插一些别的事过来,然后自己比较懒,再加上自己知识不够扎实).二进制部署完k8s集群就开始做jenkins持续 ...

  3. linux总线

    编写驱动程序: 1 #include <linux/init.h> 2 #include <linux/module.h> 3 #include <linux/devic ...

  4. 一篇文章带你初步了解—CSS特指度

    CSS特指度 说明 这篇博客在在两台电脑上分别完成的,故而有些截图是Firefox,有些是Chrome,有些改动了浏览器的用户样式表,有些没改,但不会影响阅读,特此说明,勿怪. CSS选择器 单个CS ...

  5. 20200927gryz校赛心得

    今天gyh学长给我们办了一场校内模拟赛,特地跑来记录一下心得 昨天晚上问了一下lkp学长,听说题目不卡常,不毒瘤,因此我在考试前20分钟仍在若无其事的练习着刚学的强连通分量,丝毫不慌 结果虽然rank ...

  6. 谁再把IDEA的Project比作Eclipse的Workspace,我就跟谁急

    前言 你好,我是A哥(YourBatman). 有一个观点:若一个Java开发者能把IDEA玩得666,则技术一定不会差:但若玩不转IDEA(如不会设置.定制.解决日常问题.快捷键等等),那大概率水平 ...

  7. Spark SQL 自定义函数类型

    Spark SQL 自定义函数类型 一.spark读取数据 二.自定义函数结构 三.附上长长的各种pom 一.spark读取数据 前段时间一直在研究GeoMesa下的Spark JTS,Spark J ...

  8. Tomcat 详解URL请求

    这里分析一个实际的请求是如何在Tomcat中被处理的,以及最后是怎么样找到要处理的Servlet的?当我们在浏览器中输入http://hostname:port/contextPath/servlet ...

  9. Linux 下mv和cp命令

    注意事项:mv与cp的结果不同,mv好像文件"搬家",文件个数并未增加.而cp对文件进行复制,文件个数增加了. 一.cp命令 cp命令用来将一个或多个源文件或者目录复制到指定的目的 ...

  10. 纯js添加类

    1.el.setAttribute('class','abc'); <!DOCTYPE HTML><HTML><HEAD><meta charset=&quo ...