0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是Mutex互斥锁

strongerHuang 来源:strongerHuang 作者:strongerHuang 2022-08-22 09:03 次阅读

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

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

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

什么是Mutex互斥锁?

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

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

7fafbf8c-21b0-11ed-ba43-dac502259ad0.png

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

嵌入式专栏

2

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解锁”,则会出现“死锁”的情况。

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

解决办法

比如对任务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解锁}

出问题的原因, 当一个任务获得了临界区资源的锁,在没有释放这个锁的前提下又去获得另外一块临界区资源,这个时候就要引起足够的注意了,设计成败在于你是否彻底理解了之前的问题。 但是,归根到底这样的问题还是要求用户在设计阶段去避免,一个系统不可能是万能的,正确的设计才是最重要的。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6792

    浏览量

    88725
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119349
  • Uart串口
    +关注

    关注

    0

    文章

    29

    浏览量

    6785

原文标题:RTOS 任务间互斥的问题

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux内核同步机制spinlock详解

    引起的可以考虑用信号量或mutex互斥,但如果发生在中断上下文,这时候信号量和mutex就无法使用了,因为这两种机制是可以睡眠的,而中断
    发表于 06-26 16:05 4189次阅读

    Linux高级编程---互斥

    进行操作。在此处我们主要针对互斥Mutex)进行介绍,互斥也是多线程间同步的主要方法之一。互斥
    发表于 01-13 10:07

    线程 ,生产者. 消费者 互斥,条件变量

    _t mutex; //互斥 pthread_cond_t cond_full,cond_empty;//队列判满,判空 条件变量lqueue_t *head;//初始化队列int i=0;void
    发表于 11-18 13:47

    小熊派华为物联网操作系统LiteOS内核教程05-互斥

    对共享资源的保护从而实现独占式访问。互斥(mutex)又称互斥型信号量,是一种特殊的二值信号量,用于实现对共享资源的独占式处理。另外,Huawei LiteOS提供的
    发表于 01-19 11:02

    【HarmonyOS HiSpark AI Camera试用连载 】第三次回眸-鸿蒙的线程和互斥

    放在附件上面吧。常用的几个函数:pthread_create创建新线程;pthread_mutex_lock互斥加锁操作;pthread_cond_wait等待条件
    发表于 11-13 02:22

    【HarmonyOS HiSpark AI Camera 】第三次回眸-鸿蒙的线程和互斥

    程;pthread_mutex_lock互斥加锁操作;pthread_cond_wait等待条件;pthread_cond_signal解除被阻塞的线程;[code]#include #include
    发表于 11-13 20:01

    BearPi-HM_Nano案例开发

    地进行开发。例程列表如下所示:[td]编号类别例程名说明A1内核thread任务交替打印A2内核timer定时器A3内核event事件A4内核mutex互斥A5内核semp信号量A6内核message
    发表于 04-08 17:18

    互斥量源码分析测试

    文章目录互斥量源码分析测试参考资料:RTT官网文档关键字:分析RT-Thread源码、stm32、RTOS、互斥量。互斥量在其他书籍中的名称:mutex
    发表于 08-24 06:01

    Linux多线程同步互斥Mutex详解

    _unlock(pthread_mutex_t *mutex);返回值: 成功则返回0, 出错则返回错误编号.3. 死锁:死锁主要发生在有多个依赖存在时, 会在一个线程试图以与另一个线程相反顺序锁住
    发表于 04-02 14:45 290次阅读

    RTOS开发中的Mutex互斥

    在基于RTOS开发项目时,通常都会遇到互斥的情况,比如:几个任务都要使用一个UART串口进行发送数据。
    的头像 发表于 04-07 10:32 2449次阅读

    Linux互斥的作用 互斥是什么

    1、互斥 互斥mutex),在访问共享资源之前对互斥
    的头像 发表于 07-21 11:13 879次阅读

    c++线程中的基本类型和用法

    线程之间的有:互斥、条件、自旋、读写、递归
    的头像 发表于 11-09 15:02 2230次阅读
    c++线程中<b class='flag-5'>锁</b>的基本类型和用法

    互斥、条件变量、读写、自旋及信号量介绍

    ,如果不做任何处理的话,打印出来的东西肯定是错乱的。 在线程里也有这么一把——互斥mutex),互斥
    的头像 发表于 11-10 16:16 1685次阅读
    <b class='flag-5'>互斥</b><b class='flag-5'>锁</b>、条件变量、读写<b class='flag-5'>锁</b>、自旋<b class='flag-5'>锁</b>及信号量介绍

    多线程同步的几种方法

    多线程同步是指在多个线程并发执行的情况下,为了保证线程执行的正确性和一致性,需要采用特定的方法来协调线程之间的执行顺序和共享资源的访问。下面将介绍几种常见的多线程同步方法。 互斥Mutex
    的头像 发表于 11-17 14:16 1098次阅读

    互斥和自旋的实现原理

    互斥和自旋是操作系统中常用的同步机制,用于控制对共享资源的访问,以避免多个线程或进程同时访问同一资源,从而引发数据不一致或竞争条件等问题。 互斥
    的头像 发表于 07-10 10:07 379次阅读