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,一经查实,立即删除!

相关文章

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(程序存储)、输入输出设备(串口…

深圳,四月

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

OOB与COM交互读写本地文件

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

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

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

纠结

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

RTSP的报文结构

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

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

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

计算机指令称,通俗解释什么叫计算机指令?

实际上能接触到“计算机指令”的人,只是少数电脑工程师。现在一般的电脑程序员都已经无需使用计算机指令了,因为他们编程序已经使用高级的计算机语言了。下面我尽量用通俗的语言来试着解释。计算机由CPU、内存、硬盘、显示器和键盘等部件组成。计算机软件…

STM32和Arduino对比,谁更厉害?

前两天有一个同学问我嵌入式的学习路线他是一个大三的学生,我看了他的简历,里面几乎没什么项目经验,对于企业来说这样的学生就好比一张白纸一样,当然,这样的学生很难拿到一份好的offer。学习路线的文章我记得已经发了很…

人大计算机在职考研好考吗,人大在职研究生好考吗?通过率高吗?

答:最近咨询人大在职研究生进行学习的人非常多,其中咨询最多的问题是考试难度及通过率。下面就通过在职研究生招生信息网为大家介绍一下,人大在职研究生好考吗?通过率高吗?人大在职研究生招生是采用同等学力申硕的方式,该方式是…

可能你还不懂浮点数

在网上看到一个问题然后看到这篇关于浮点数的文章,希望大家看了之后有所启发想一下,为什么第一个打印的和预设值不同,但是第二个是相同的?如图:尾数部分是如何转变成二进制的?前言很多人在初学写程式时都会…

RTP协议的封装

最近一段时间学习了RTP协议相关的内容,一方面为了将自己学到的部分记录下来,便于后续查找,另一方面用于记录笔记 一个协议的封装是为了满足协议的功能需求的。从前面提出的功能需求,可以推测出RTP封装中应该有同步源和时戳等字段&…

Alpha冲刺(7/10)

团队信息 队名:爸爸饿了组长博客:here作业博客:here组员情况 组员1(组长):王彬 过去两天完成了哪些任务 学会了POSTMAN的使用,对后端已经完成的接口进行了收发消息正确性的验证推进项目进度&…

epoll模型之服务器设计

Linux2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。1、为什么select落后首先,在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE…

不限学历、不限学校、华为天才少年招聘

我在前同事的朋友圈看到的招聘信息。不限学历,不限学校我相信这个规则一定会让后续的很多企业效仿,工作至今,遇到很多能力很强但是学历一般的人,而对于面试者,可以大胆的说出那句话,人家华为都不限制学校学…

linux学习第九天 (Linux就该这么学)

今天讲了raid0 至少两块盘串联在一起,读写性能提升,但不具备数据备份和错误修复能力,RAID1把两块盘绑定,在写入数据时,同时写入到多块硬盘设备,raid5推荐使用,10推荐使用 LVM,今天是在外面加班…

[Windows Phone] 为应用添加后台计划任务 – Scheduled Task Agent

前段时间做过一个天气应用,一直是只支持前台获取数据,上周末参加了Windows Phone的CodeJam和高手们交流了一下,发现实现后台定时更新功能也不是很难,于是在网上找一些资料,在找资料的过程中发现,网上的一些…

全能终端神器MobaXterm

摘要:现今软件市场上有很多终端工具,比如:secureCRT、Putty等等。secureCRT其实也是一款很强大的终端工具,但它是收费软件,一般公司不允许使用。Putty,非常小巧,免费软件,但是不支持…

入群问的这道C题目,还没人答对

最近好几个同学加我微信&#xff0c;让我帮忙拉他入群&#xff0c;然后我就随手问了个题目&#xff0c;如下上面回答的答案都是不正确的sizeof是 C语言的关键字&#xff0c;这个关键字是用来计算传入参数占用的内存字节数。比如#include <stdio.h> int main() {int a 1;…