一、各种资源管理方法简介

μC/OS-Ⅲ系统中提供了一些基本方法用于管理共享资源(典型的共享资源有:变量、数据结构体、RAM中的表格、IO设备中的寄存器等)。资源共享方法名称及适用范围如下表所示。

资源共享方法

适用范围

关中断、开中断

当访问共享资源的时间很短以至于方位共享资源所花的时间小于μC/OS-Ⅲ关中断时间时使用。

由于该方法会增加中断延迟,因此极不推荐该方法。

给调度器上锁、解锁

当访问共享资源的时间比μC/OS-Ⅲ关中断时间长,比给调度器上锁时间短时使用。

该方法会使上锁的任务成为优先级最高任务,产生优先级变化,因此也不推荐使用。

信号量

当所有任务访问共享资源时可以无限等待。

使用该方法会产生优先级反转问题,不过他比互斥型信号量速度略快。

互斥型信号量

该方法是访问共享资源的首选方法,可以适应绝大部分情况下的需求。

(1)关中断/开中断

关、开中断是独占共享资源最简单也是最快捷的方法。μC/OS-Ⅲ访问系统内部的变量和数据结构时,绝大部分使用的就是这种方法,一次来确保操作的“原子性”。这种方法也是任务和中断服务程序共享变量或数据结构的唯一方法。

使用这种方法时,只要关中断时间比系统本身关中断时间短(或相同),就不会增加中断延迟。然而尽管如此,仍要尽量避免关中断,因为这将影响到系统对实时事件的响应能力。

(2)给调度器上锁/解锁

如果任务不需要和中断服务程序共享变量或数据结构,那么可以通过给调度器上锁的方法来访问共享资源。需要注意的是,一旦给调度器上锁,即使有更高优先级的任务就绪了,也要等当前任务执行完毕,解锁后才能切换到其他任务。也就是说一旦某个任务给调度器上锁,那这个任务就成为了优先级最高的任务。

(3)信号量

信号量是一种上锁机制,代码必须获得对应钥匙(解锁)才能继续执行。信号量一共有6个相关API函数:

1、OSSemCreat()          ---建立一个信号量

2、OSSemDel()              ---删除一个信号量

3、OSSemPend()           ---等待一个信号量

4、OSSemPendAbort() ---取消等待

5、OSSemPost()             ---释放或者发出一个信号量

6、OSSemSet()               ---强制设置一个信号量的值

针对不同的情况一共有两种信号量。

1、二进制信号量

当一个资源只有两种状态时(空闲、被占用),则使用此信号量。二进制信号量非0即1,当任务间共享变量、单一IO设备时可使用此信号量。

2、计数型信号量

计数型信号量用于某资源可同时被几个任务使用的情况。例如某个缓冲池(Buffer)有10个缓冲块,任务可以申请其中一个缓冲块,此时可使用技术型信号量,且信号量初始值被设置为10。当信号量为0时,表示缓冲区满,需要等待。

信号量是一个os_sem类型数据,包含5个成员:

1、Type          ---存储变量类型;

2、*NamePtr---存储用户给该变量定义的名字,用于调试;

3、PendList   ---该信号量的任务挂起表;

4、Ctr             ---信号量的计数器成员;

5、TS              ---时间戳,记录信号量上一次被释放的时间。

优先级反转是使用信号量要特别注意的问题,假设有两个不同优先级的任务同时使用一个信号量,介于两个优先级之间还有一个优先级的任务要运行,若高优先级任务需要等待低优先级任务释放信号量,则此时在任务调度过程中,会将高优先级任务挂起,首先执行中等优先级任务,然后执行低优先级任务,待低优先级任务释放信号量后,再执行高优先级任务。此时高优先级任务已经降到和低优先级任务相同的优先级。在使用信号量时要特别注意这种情况。

(3)互斥型信号量

互斥型信号量是一种特殊的二进制信号量,其与普通信号量唯一的不同在于一旦一个高优先级的任务需要依赖低优先级任务发布信号量,则将低优先级任务的优先级暂时提高到与高优先级任务相同的优先级,带信号量发布完成后,再恢复其优先级。

互斥型信号量有5个API函数:

1、OSMutexCreate()        ---建立一个互斥型信号量

2、OSMutexDel()              ---删除一个互斥型信号量

3、OSMutexPend()           ---等待一个互斥型信号量

4、OSMutexPendAbort()---取消等待

5、OSMutexPost()            ---释放或发布一个互斥型信号量

互斥型信号量是一个os_mutex类型数据,包含7个成员:

1、Type          ---存储变量类型;

2、*NamePtr---存储用户给该变量定义的名字,用于调试;

3、PendList   ---该信号量的任务挂起表;

4、*OwnerTCBPtr---如果互斥型信号量被一个任务占用,则该成员保存该任务的OS_TCB。

5、OwnerOriginalPrio---记录任务占有互斥型信号量之前的优先级。

6、Ctr             ---μC/OS-Ⅲ允许任务多次嵌套“获取”互斥型信号量,但是释放次数必须和获取次数一样多。

7、TS              ---时间戳,记录信号量上一次被释放的时间。

二、死锁

死锁(deadlock)也叫做抱死(deadly embrace),指两个任务无限制地相互等待对方控制着的资源。

假设某一时刻,任务A获取资源X,任务B获取资源Y,运行一段时间后,任务A和任务B均未释放资源,此时任务A试图获取资源Y,任务B试图获取资源X,则发生死锁。

避免死锁的方法有三种:

1、先得到全部需要的资源,再做下一步工作;

2、用相同的顺序申请多个资源;

3、在调用请求信号量的函数中设定超时时间,该方法仅可以暂时缓解,但是有可能导致死锁重复出现多次。

上述三个方法中,个人建议严格按照方法2来避免死锁。

μC/OS-Ⅲ系统的资源管理的更多相关文章

  1. OS.js – 开源的 Web OS 系统,赶快来体验

    OS.js 是一个开源的 Web OS 系统,可以在浏览器中运行,提供了窗口管理器,应用程序API,用户界面开发套件和抽象的文件系统等.可以部署在 Node 或者 PHP 环境中运行.OS.js is ...

  2. OS 系统下安装MySql 配置MySql环境变量

    学习Hive需要,闲话不说 本文的内容: 下载Mysql for Mac 下载Mysql Workbench 安装 Mysql 和 Mysql Workbench 配置Mysql在OS 系统上的环境变 ...

  3. 首个攻击该Mac OS系统的恶意软件——KeRanger

    首个攻击该Mac OS系统的恶意软件——KeRanger 曾几何时,苹果操作系统一度被人认为是最安全的操作系统.然而近几年,针对苹果系统的攻击日益增多,影响范围也越来越大.无独有偶,近日,苹果Mac  ...

  4. 在 Linux 的 KVM虚拟机 上安装 Mac OS 系统的研究总结

    在 Linux 的 KVM虚拟机 上安装 Mac OS 系统的研究总结 一.资料来源:    网上一共找到两个方法,一个是视频上的教程,一个是网页资料. 二.视频资料方法内容:1.install qe ...

  5. Google工程师打造Remix OS系统 桌面版安卓下载

    三位前Google工程师打造的Remix OS系统终于来到了PC桌面上,现已可以下载尝鲜. Remix OS for PC基于Android-x86项目,由安卓5.1 Lollipop深度定制而来,不 ...

  6. Mac OS系统

    Mac OS系统 目录 概述 Mac OS系统常用操作 概述 Mac OS系统常用操作 显示或隐藏文件 在终端输入:defaults write com.apple.finder AppleShowA ...

  7. ARM公布“物联网”嵌入式mbed OS系统软件平台

    继ARM公司发布了为嵌入式微控制器设计的Cortex-M7架构处理器,ARM又公布了专为廉价低功耗“物联网”设计的新版软件及系统平台,以加速物联网设备的发展及部署.该软件为基于ARM现有Cortex- ...

  8. 教你Mac OS系统四种改动Hosts文件的方法

    使用Mac OS X系统的用户.在某些时候可能遇到了须要改动系统Hosts文件的情况,那么Mac OS系统怎样改动Hosts文件呢?和Windows系统有何差别呢?我们知道事实上改动Hosts文件仅仅 ...

  9. 使用VMware Workstation Pro 12 虚拟机安装Mac OS系统教程 全程图解

    导读:使用虚拟机安装Windows.Linux或者Ubuntu系统大家或许看了很多,但如何使用VMware Workstation Pro 12安装Mac OS,的确需要好好研究一番:否则无法下手,因 ...

  10. Mac os系统gdb调试器的安装与使用

    Mac os系统gdb调试器的安装与使用 1.简介 Mac os下的Terminal 终端中默认情况下并没有安装gdb调试器,但是可以通过gcc编译器进行代码编译,如果出错了就需要通过gdb调试器进行 ...

随机推荐

  1. CentOS直接解压可用的memcached、nginx、keepalived

    Centos均基于x86_64版本,下面相关文件编译时使用用户组为www,用户为www 相关命令: groupadd -r www useradd -r -g www -M www memcached ...

  2. UE4 AI入门

    转自:http://blog.csdn.net/u011707076/article/details/46607121 本文是翻译的官方文https://docs.unrealengine.com/l ...

  3. 微信小程序-发起请求

    wx.request(object) wx.request发起的是https请求.一个微信小程序,同时只能有5个网络请求连接. object参数说明: 示例代码: wx.request({ url: ...

  4. kali/centos 更新 java

    kali 转自:http://blog.sina.com.cn/s/blog_5736d8870102w15u.html 墙内的论坛上和博客上有很多这样的文章了,不过一般过程都很复杂,让人看的头晕眼花 ...

  5. js设计模式总结-代理模式

    代理模式 解决哪一类问题 从字面意思上理解,代理模式解决对一个对象的直接访问,这种直接访问可能是"不方便"的,所谓"不方便"可能是直接访问成本比较大(在前端领域 ...

  6. Openlayers自定义简单popup

    OpenLayers中可以使用很多种类型的popup,大家可以到Openlayers的 popupMatrix.html示例中看.之前存在这样一个错误的想法:popup和marker是绑定的,要有po ...

  7. Nodejs学习总结 -Express入门(一)

    Express是基于Node.js平台开发的Web应用开发框架,下面我们入手学习. 官网 : http://www.expressjs.com.cn/ github:https://github.co ...

  8. windos系统定时执行批处理文件(bat文件)

    Win7怎么设置定时自动执行任务? 点击开始按钮,依次选择打开“所有程序—附件—系统工具”,找到“任务计划程序”即可打开Win7系统的任务计划设置面板.也可以点击Win7开始按钮,在多功能搜索框中输入 ...

  9. 插件dTree的使用

    解压缩dtree.zip 包.  dtree目录下包括这些文件:example01.html . dtree.js . api.html . dtree.css 和img目录       注意:除了a ...

  10. web前端图片极限优化策略

    随着web的发展,网站资源的流量也变得越来越大.据统计,60%的网站流量均来自网站图片,可见对图片合理优化可以大幅影响网站流量,减小带宽消耗和服务器压力. 一.现有web图片格式 我们先来看下现在常用 ...