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

    文章

    6512

    浏览量

    87609
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118796
  • Uart串口
    +关注

    关注

    0

    文章

    28

    浏览量

    6715

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

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

收藏 人收藏

    评论

    相关推荐

    如何在Semaphore(信号量)和Mutex互斥)之间做选择?

    在单CPU系统中,处理器是一个共享资源。在多个进程之间共享处理器时,处理器的使用由调度程序控制,不存在竞争问题。
    的头像 发表于 03-05 11:35 588次阅读
    如何在Semaphore(信号量)和<b class='flag-5'>Mutex</b>(<b class='flag-5'>互斥</b>)之间做选择?

    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

    Linux C 多线程编程之互斥与条件变量实例详解

    一、互斥互斥量从本质上说就是一把, 提供对共享资源的保护访问。1. 初始化:在Linux下, 线程的互斥量数据类型是pthread_
    发表于 06-03 17:13

    小熊派华为物联网操作系统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

    深入了解互斥锁、条件变量、读写锁以及自旋锁

    ,而C++11只包含其中的部分。接下来我主要通过pthread的API来展开本文。 mutex互斥量) mutex(mutual exclusive)即互斥量(
    的头像 发表于 11-01 10:02 1694次阅读

    FreeRTOS 队列 信号量 互斥

    文章目录前言Queue 队列semaphore 信号量Mutex 互斥量微信公众号前言FreeRTOS STM32CubeMX配置 内存管理 任务管理上节介绍了用STM32CubeMX生成
    发表于 12-09 09:51 0次下载
    FreeRTOS 队列 信号量 <b class='flag-5'>互斥</b>量

    RTOS开发中的Mutex互斥

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

    线程之间的锁的基本类型和用法

    线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能与性能成反比。不过我们一般不使用递归锁(C++标准库提供了std::recursive_mutex),所以这里就不
    的头像 发表于 11-09 09:15 254次阅读
    线程之间的锁的基本类型和用法

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

    线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能与性能成反比。不过我们一般不使用递归锁(C++标准库提供了std::recursive_mutex),所以这里就不
    的头像 发表于 11-09 15:02 342次阅读
    c++线程中锁的基本类型和用法

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

    ,如果不做任何处理的话,打印出来的东西肯定是错乱的。 在线程里也有这么一把锁——互斥锁(mutex),互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁(
    的头像 发表于 11-10 16:16 266次阅读
    <b class='flag-5'>互斥</b>锁、条件变量、读写锁、自旋锁及信号量介绍