RTOS 任务间互斥的难题

作者 | strongerHuang

微信公众号 | 嵌入式专栏

在基于RTOS开发项目时,通常都会遇到互斥的情况,比如:几个任务都要使用一个UART串口进行发送数据。

如果不加互斥锁,优先级高的任务,会抢占串口并发送数据,则有可能会出现发送数据“乱码”的情况。

今天就说说在RTOS开发中,互斥锁一个常见的问题。

什么是Mutex互斥锁?

学习过RTOS的读者应该对互斥不陌生,互斥锁就是为了避免任务之间互相抢占某种资源而设计的一种“锁”。

就如上面说的,一个串口,被两个任务抢占,如果不加锁,则会出现两个任务交叉发送数据,即“乱码”;

062d5a7d029269d9f565b7293dd71938.png

但是,如果加了互斥锁,则会等待其他任务发送完成之后才继续发送,保证了数据的完整(而不是乱码);

Mutex互斥锁例子

这里以三个任务、两个互斥锁为例,代码如下:

void task1()
{/*do something*/OSMutex1_Pend();  //互斥锁1加锁/*加锁处理事情*/OSMutex1_Post();  //互斥锁1解锁
}void task2()
{/*do something*/OSMutex1_Pend();  //互斥锁1加锁OSMutex2_Pend();  //互斥锁2加锁/*加锁处理事情*/OSMutex2_Post();  //互斥锁2解锁OSMutex1_Post();  //互斥锁1解锁
}void task3()
{/*do something*/OSMutex2_Pend();  //互斥锁2加锁/*加锁处理事情*/OSMutex2_Post();  //互斥锁1解锁
}

这样设计,大家看出问题了吗?

老司机应该看出来了,新手可能摸不着头脑。

在任务2中,进行了2次加锁、解锁,而且“环环相扣”。

Mutex互斥锁问题

假如任务1、 任务2、 任务3优先级分别为:1、 2、 3。

优先级顺序就是:任务1 > 任务2 > 任务3(数字越小代表任务优先级越高)。

假设:任务1和任务2处于等待事件状态,也就是处于阻塞状态, task 3 处于运行状态

当任务3在“加锁处理事情”的时候,任务2抢占了任务3(任务2挂起时间到了),此时任务3挂起,任务2处于运行状态

如果任务2在“互斥锁1加锁”之后,任务1抢占了任务2,此时,任务1处于运行状态

这个时候,你发现问题了没有?

任务1在执行“OSMutex1_Pend();”会等待“互斥锁1解锁”,如果其他方式没有对“互斥锁1解锁”,则会出现“死锁”的情况。

分享一张图片,你就会明白什么是死锁了:

03a782e04575c198b3eb8b8165cd79da.png

解决办法

比如对任务2加锁方式进行改善:

void task2()
{/*do something*/OSMutex1_Pend();  //互斥锁1加锁/*do something*/OSMutex1_Post();  //互斥锁1解锁OSMutex2_Pend();  //互斥锁2加锁/*do something*/OSMutex2_Post();  //互斥锁1解锁
}

或者对低优先级的任务3加锁方式进行改善:

void task3()
{/*do something*/OSMutex1_Pend();  //互斥锁1加锁OSMutex2_Pend();  //互斥锁2加锁/*加锁处理事情*/OSMutex2_Post();  //互斥锁2解锁OSMutex1_Post();  //互斥锁1解锁
}

出问题的原因, 当一个任务获得了临界区资源的锁,在没有释放这个锁的前提下又去获得另外一块临界区资源,这个时候就要引起足够的注意了,设计成败在于你是否彻底理解了之前的问题。

但是,归根到底这样的问题还是要求用户在设计阶段去避免,一个系统不可能是万能的,正确的设计才是最重要的。

6a10848d570f1da50cf23c65bfde76ba.png

------------ END ------------

4213a86fdca5bc69822d425d783970b4.png

1564553faf43ba09c98e357b6557003c.png

点击“阅读原文”查看更多分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

武汉工程大学计算机学院研究生难吗,武汉工程大学考研难吗?一般要什么水平才可以进入?...

问:从武汉工程大学毕业的学生就业怎么样?值不值得报考?答:2020年武汉工程大学就业质量报告未公布,从2019年武汉工程大学就业质量报告来看:2019届硕士毕业生就业463人,就业率为95.66%。2019届研究…

android中绘图Paint.setAntiAlias()和Paint.setDither()方法的作用

转载:http://blog.csdn.net/lovexieyuan520/article/details/50732023 在自定义View中,这两个Paint.setAntiAlias()和Paint.setDither()方法用的很多,都只有一个boolean值,作用大家未必清楚,今天抽了点时间研究下&…

简单分析STM32和51的区别

分享本文,简单分析STM32与51单片机的区别与取舍之处。单片微型计算机简称单片机,简单来说就是集CPU(运算、控制)、RAM(数据存储-内存)、ROM(程序存储)、输入输出设备(串口…

OpenGL ARB 看来终于想通了,OpenGL SDK终于要出来了。

OpenGL 一直缺乏一个SDK的支持,所以让使用者都要自力更生的去收集资源。正因为支持的不利,所以才让一部分人转投技术支持完备的Direct 3D。 现在情况终于有所改观了,OpenGL会于今年早期推出一个统一的SDK。内容包括参考文档、教程、示例演…

自己做计算机三级,计算机三级辅导:自己“做”软驱

缺少了软驱这位“老朋友”,有时还真不太方便。有些商业软件在安装或更新时会要求从软盘中读取安装信息,远的如过去的Office 97中的钥匙盘,近的如瑞星杀毒软件安装时的协议盘。这种时候,我们该怎么办呢?很明显,您不太可…

深圳,四月

我是一个工程师,每天有干不完的活,做不完的事情,还有加不完的班!认识的一个同学要去北京,我们昨天一块吃饭,他说了未来的计划,他说让我去北京了去找他,他还说让我把地址给他&#xf…

OOB与COM交互读写本地文件

相信读过前几篇Silverlight Out of Browser实例教程的朋友已经对Silverlight的OOB应用有了一定的认识和了解。今天,我们将讨论Silverlight Out of Browser的另外一个功能实例,Silverlight OOB与COM API的交互操作。在开始实例之前,我们先了解…

Java中遍历删除ArrayList中多个元素

Java中遍历删除ArrayList多个元素 Iterator itr list.iterator(); while(itr.hasNext()) {int i itr.next();if (i > 5) { // filter all ints bigger than 5itr.remove();} }

github生成SSH公钥

第一步:头像下面有个setting,进去 第二步:找到 SSH and GPG keys 这个目录,点击,右边有个 New SSH key,这里就是填写公钥的地方,那么公钥怎么生成呢? 第三步:终端输入 ssh-keygen…

oracle服务说明

注:SID - 数据库标识HOME_NAME - Oracle Home名称,如OraHome92、OraHome81(1)OracleServiceSID 数据库服务,这个服务会自动地启动和停止数据库。如果安装了一个数据库,它的缺省启动类型为自动。服务进程为O…

洛阳理工学院计算机类分数线,2010洛阳理工学院招生对口计算机吗?分数线大概是多少...

就上大学网为您推荐类似问题答案问题1:2010年唐山职业技术学院招收计算机对口分数线大概是多少?你的分数查不多,报第一纸鸢问题不大!问题2:2010年河南省洛阳市理工学院大专录取分数线是多少?洛一高600分&am…

在Google工作的十年,也是我开心的十年

大家好,我是写代码的篮球球痴,昨晚看到bug君发的这篇文章,文章的主人公在Google工作了10年,我认真看了文章里的每一个字,我特别羡慕这样的工作和环境,当然,我相信我们有一天也会是这样的&#x…

谈判高手子贡---引导“用户”的专家

谈判高手子贡---引导“用户”的专家Jack zhai子贡是孔子的弟子,但他更为让人乐道的是他出色的外交才能。子贡复姓端木,名赐,卫国人,思维敏捷,嘴皮上的功夫,绝对不亚于后来的苏秦与张仪。故事说的是公元前48…

流媒体传输协议系列之--RTSP协议详解

1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话。 首先创建RTSP服务器(具体实现类是DynamicRTSPServer),在创建过程中,先建立Soc…

身份证明检索失败,如何解决?

今天遇到一个很奇怪的问题2台几乎完全一样的机器,连同一台ORACLE服务器,可是一台机上测试成功,另一台机器测试失败,神奇!上网搜索了资料后发现问题,解决方法如下,本人已经实践证明下面的方法确实…

纠结

几年前,我一同事回家创业,当时我们一起做软件开发,他觉得上班没意思,就决定回老家创业,当时他创业的项目是零售项目,离职回去筹备了几个月,跟我们看到的创业老板一样,当时他也去挖了…

管理系统中计算机应用第二章,管理系统中计算机应用第二章.doc

管理系统中计算机应用第二章.doc第二章 企业管理的信息化平台一、单项选择题(本大题共30小题,每小题1分,共30分)1.从理论上分析,传统的IP地址(IPv4)最多可以访问的用户数是( )A.255*255*255*255   B.8*8*8*8   C.32*32*32*32   D.256*2…

更新了一个新版本的editplus 语法文件(for nagios)

从editplus上下载的nagios 语法文件,发现不支持nrpe.cfg 很多参数也没有 在它上面更新了一下,版权是原作者的 转载于:https://blog.51cto.com/yahoon/743633

RTSP的报文结构

RTSP的报文结构 RTSP是一种基于文本的协议,用CRLF作为一行的结束符。使用基于文本协议的好处在于我们可以随时在使用过程中的增加自定义的参数,也可以随便将协议包抓住很直观的进行分析。 RTSP有两类报文:请求报文和响应报文。请求报文是指从…

Qt性能优化,一位资深Qt工程师的经验

Qt是一个1991年由Qt Company开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智嵌入式系统 QN…