嵌入式OS入门注意事项-同RTX案件:九.关于优先-翻转,继承和天花板

嵌入式OS入门注意事项-同RTX案件:九.关于优先-翻转,继承和天花板

涉及当调度优先级,会有很多问题,本文中,优先调度和一些战略的主要问题,以应付。

有几个概念如下:(priority inversion),优先度继承(priority inheritance)策略和优先度天花板(priority ceiling)策略。

1.优先度翻转(priority inversion)

大部分的RTOS都支持给不同进程分配优先度,一定程度上可以让调度和时间管理灵活性更大。

可是当涉及到一些代码临界区(critical section)的时候,可能就会出现故障。优先度翻转就是这样一个典型的问题。为了解释这个概念,我们先来看一个实际样例:

首先我们考虑三个进程,T1。T2,T3。

T3的优先度大于T2,T2的优先度大于T1,採用的调度算法是优先度高的能够打断优先度低的进程,临界区等待能够阻断高优先度的进程。

考虑在一个时间轴上。下面事件依次发生:

  1. T1被创造
  2. T1要求进入资源R临界区
  3. T2被创建
  4. T3被创建
  5. T3要求进入资源R临界区

光看文字可能会比較抽象。我们把每一个事件都画在下图:

请先依照时间顺序从左到右看一下全部事件。有没有认为有什么不妥的?

假设没有认为不妥的,我们再依照每一个进程来看。进程1首先被创建。然后进入了临界区运行,然后被阻断,然后又一次进入临界区运行。中间的阻断时间是三个进程最长的。

进程2第二被创建。一创建就打断了进程1,直到被阻断,然后恢复正常运行直到进程消灭。进程3最后被创建。一创建就打断了进程2,直到要求进入临界区被阻断。然后再恢复临界区运行,阻断时间是三个进程中第二长的。

问题恰恰出如今这里:进程3被什么阻断了?进程3由于要求资源R的临界区,而此时资源R临界区被进程1占用。理想状态我们应该让进程1尽快运行尽早退出临界区。以便进程3(当前最高优先度)可以及早运行。可实际上,由于进程1被进程2阻断(进程2优先度比进程1优先度高),所以进程2阻断了希望继续在临界区运行的进程1。直到进程2完毕!

所以,进程3实际上是被进程2阻断了,低优先度的进程阻断了高优先度的进程,这就是优先度翻转问题。(临界区运行阻断不属于优先级阻断。而是资源阻断。

)上面这个样例,假设我们把进程2的运行时间无限延长的话,进程3就全然没有办法继续运行了。

也就是说。理想情况下。我们希望高优先度的进程的最大阻断时间受限于低优先度进程的临界区运行时间之和,实际上在这样的最简单的设定下。高优先度的最大阻断时间是低优先度进程临界区运行时间之和加上优先度高于临界区运行进程的进程的运行时间之和。

一个简单的解决方式,就是在临界区时禁止中断,虽然这个确实可以解决优先度翻转问题,但我们假设考虑例如以下的情况:

这相当于无条件地阻断了进程2和进程3,显然不是我们想要的结果。

2.优先度继承(priority inheritance)

一个比較好的解决的方法就是优先度继承。

优先度继承的意思是,将临界区内的进程的优先度提高为该进程阻断的进程里的优先级最高进程的优先级。这么说可能还是非常绕。我们看一下这个办法详细如何解决我们上面提到的样例的:

当进程3要求进入R临界区运行时,由于被进程1阻断了,进程1此时在临界区内,并且它阻断的是进程3,那么此时它的优先度就会提升为进程3的优先度,也就是说继承了进程3的优先度。

当退出临界运行区后,进程1优先度又会降为原先的优先度。

这就非常好地攻克了高优先度进程被无条件阻断的问题,上面这个样例里面,进程3的阻断时间事实上仅仅是进程1临界区运行的时间。

但这也会引起死锁的问题。我们看以下这个样例:

  1. T1被创造
  2. T1要求进入资源A临界区
  3. T2被创建
  4. T2要讲求进入资源B临界区
  5. T2要求进入资源A临界区
  6. T1要求进入资源B临界区

当进程2要求资源A临界区时,由于进程1正在资源A临界区内。所以其优先级继承了进程2的优先级,但进程1运行了一段时间后又要求进入资源B临界区以完毕当前任务。退出临界区A。两个进程此时都在等待对方退出临界区。而自己却不会主动退出自己占有的临界区,所以死锁。

3.优先度天花板(priority ceiling)

这个策略就是为了解决优先度继承的死锁问题。

详细说来就是,为每一个资源定义优先度天花板,资源的优先度天花板是全部可能要相互排斥使用该资源的进程的最高优先度。

这样的策略仅仅同意满足一个条件的进程去进入临界区,而这个条件就是。该进程的优先度要大于(等于不足够)。全部其它进程占用的资源的优先度天花板的最高优先度。同一时候保留优先度继承策略。 我们看一下上面这个样例,优先度天花板会如何处理:

当进程2想进入资源B临界区时,被阻断了,由于它优先度并不大于其它进程(进程1)占用资源(A)的优先度天花板(进程2的优先度),被进程1阻断,与此同一时候。进程1的优先度提升为进程2的优先度,继续运行,直到退出两个临界区。

4.小结

RTX的相互排斥锁和信号量有内嵌的优先度继承策略,可是没有内嵌的优先度天花板策略,所以假设你的代码涉及了2个以上独占资源。请留心避免死锁。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-08-04 13:51:22

嵌入式OS入门注意事项-同RTX案件:九.关于优先-翻转,继承和天花板的相关文章

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持

嵌入式OS入门笔记-以RTX为案例:十.Keil的RTX调试支持 调试(debug)是软件开发的一个重要环节,对于嵌入式开发而言这个环节其实比较依赖一些硬件资源(硬件debugger)的支持.传统的嵌入式系统的调试比较依赖断点(breakpoint)和单步调试(single step through).而 ARM cortex-M 系列的芯片其实有很强的CoreSight片上调试支持,实际上就是一个小的调试硬件,作为ARM的标准,内嵌在ARM的芯片里.在ARM自家的调试器ULINK-pro等的帮

嵌入式OS入门笔记-以RTX为案例:八.RTX的进程间通讯(二)

嵌入式OS入门笔记-以RTX为案例:八.RTX的进程间通讯(二) RTX的进程间通讯主要依赖于四种机制,分别是事件(Event),互斥锁(Mutex),旗语或信号量(Semaphore),和邮箱(Mailbox).前三种机制侧重进程间的同步,邮箱则侧重进程间的数据通讯.这次讲一下信号量和邮箱. 1.信号量(Semaphore) 1.简介 信号量其实是一个很抽象的操作系统原语,它最早由荷兰计算机科学家Dijkstra提 出,用于解决多项资源的分配问题.实际上信号量的适用范围非常广,可以很好地解决很

嵌入式OS入门笔记-以RTX为案例:九.关于优先度-翻转,继承和天花板

嵌入式OS入门笔记-以RTX为案例:九.关于优先度-翻转,继承和天花板 当调度涉及优先度的时候,会出现不少问题,本文关于优先度调度的主要问题和一些应付的策略.主要有以下几个概念:优先度翻转(priority inversion),优先度继承(priority inheritance)策略和优先度天花板(priority ceiling)策略. 1.优先度翻转(priority inversion) 大部分的RTOS都支持给不同进程分配优先度,一定程度上能够让调度和时间管理灵活性更大.但是当涉及到

浅谈C语言嵌入式系统编程注意事项

C语言嵌入式系统编程注意事项之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程技巧 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发的一般选择.而与之相比,C语言--一种"高级的低级"语言,则成为嵌入式系统开发的最佳选择.笔者在嵌入式系统项目的开发过程中,一次又一次感受到C语言的精妙,沉

【原创】凝思V4.2.35版本OS构筑注意事项

1. 附录凝思V4.2.35版本OS构筑注意事项 1.1 安装情况介绍 在HP PC机器上,按照安装步骤设置BIOS,启动为光盘. 插入光盘,在提示符下输入用户和口令:root/rocky 输入 setup –g 默认应该启动图形界面安装,但由于显卡不支持,安装失败. 输入setup 启动字符界面安装 (以下,安装光盘里提供的安装步骤书,进行OS的安装) 1.2 问题解决 1.2.1 安装完成后,无法进入图形界面,怎么办? 根本原因:显卡驱动未正确安装. (1) 在root用户下,执行#lspc

嵌入式LINUX入门到实践

从今天开始,用这个博客记录和总结嵌入式LINUX从入门到实践完整过程. 第一章的内容是IIC协议与自平衡小车.首先树立目标: 1.使用mini2440开发板的IIC协议,采集MPU6050六轴传感器数据. 2.将步骤1整理为驱动,写入LINUX内核. 3.编写简单的上位机3D模型,实时显示传感器状态. 4.完善上述三步骤,完成平衡小车的硬件. 5.搭建基于2440芯片的自平衡小车平台,包括机械与电路部分. 6.完成自平衡小车的平衡. 7.完成自平衡小车的前进和转向. 8.加入安卓端,进行简单的手

嵌入式行业入门指导---知乎转载【转】

此文是本人在知乎上看的,觉得很好就分享出来了,并不是本人原创 转自:https://www.zhihu.com/question/47881392 作者:shang链接:https://www.zhihu.com/question/47881392/answer/146734937来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 嵌入式Linux+Android学习路线图作者:韦东山 本文目录1. 程序员的三大方向 1.1 专业领域 1.1.1 学术研究 1.1.2

学习嵌入式怎么入门和提高?嵌入式开发教程pdf

嵌入式软件的话不一定需要学很多硬件知识的(有的话当然是多多益善).会用一些烧写工具,编译,调试工具(比如JTAG)就可以了,到时候要用了现学.开发工具也没什么固定的,一般也不一定要IDE,用文本编辑器就可以写代码(比如Vim,Emacs, nano, Sublime)了. 编译一般用GCC的变种.嵌入式一般要学C语言(去看看我的C语言探索之旅, 以及C语言深度解剖,C程序设计语言这两本书.也可以继续深入看C语言专家编程等等). C++不一定会用到, 但也可以学一下.Linux是要学习的.因为交叉

浅谈嵌入式工程师入门及嵌入式工程师进阶,学嵌入式这些你需要知道

想要从事嵌入式开发,但又不知道怎么入门的,可以看下,下面我结合自身实际来谈一谈. 前提基础:简单的电路.模电.数电知识,C语言 一.从51单片机入手 如果有一些前提的基础知识,要上手51单片机不算难.首先,你得有一块开发板,郭天祥或者普中科技的51单片机开发板都很不错,资源比较齐全,有配套视频,可以跟着视频来一步步地走进单片机的世界.因为是用C语言编程的,功能实现的过程不算复杂,有C语言基础的基本不会有问题.如果不想看视频,或者想要一本书来总结一下,我觉得郭天祥写的那个51单片机C语言教程写得比