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

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

3天内不再提示

RTOS开发中的Mutex互斥锁

strongerHuang 来源:嵌入式专栏 作者:strongerHuang 2022-04-07 10:32 次阅读

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

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

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

什么是Mutex互斥锁?

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

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

RTOS开发中的Mutex互斥锁

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

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解锁}

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

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

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

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

审核编辑:汤梓红


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

    关注

    14

    文章

    1549

    浏览量

    76270
  • RTOS
    +关注

    关注

    22

    文章

    809

    浏览量

    119490

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

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

收藏 人收藏

    评论

    相关推荐

    详解linux内核mutex同步机制

    在linux内核互斥量(mutex,即mutual exclusion)是一种保证串行化的睡眠机制。和spinlock的语义类似,都是允许一个执行线索进入临界区,不同的是当无法获
    的头像 发表于 05-13 08:56 6782次阅读
    详解linux内核<b class='flag-5'>中</b>的<b class='flag-5'>mutex</b>同步机制

    Linux高级编程---互斥

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

    【MiCOKit试用体验】庆科MiCO系统篇(3)MiCO RTOS互斥

    本帖最后由 gjianw217 于 2015-10-25 15:45 编辑 在本帖子,主要分析一下庆科MiCO RTOS互斥,具体包括:OS
    发表于 10-24 17:02

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

    实现在 liteos_imp.c文件:接口名功能描述osal_mutex_create创建互斥osal_mutex_del删除
    发表于 01-19 11:02

    BearPi-HM_Nano开发板鸿蒙OS内核编程开发——互斥

    BearPi-HM_Nano开发板鸿蒙OS内核编程开发——互斥本示例将演示如何在BearPi-HM_Nano开发板上使用cmsis 2.0
    发表于 04-09 10:02

    互斥量源码分析测试

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

    如何在RK2206上使用鸿蒙LiteOS-M内核接口进行互斥编程开发

    );描述:释放指定的互斥参数:返回值:软件设计主要代码分析在mutex_example函数,通过LOS_MuxCreate函数创建了互斥
    发表于 08-05 16:28

    Linux多线程同步互斥Mutex详解

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

    Linux 多线程互斥互斥

    调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程完成。互斥量模型#include pthread_mutex_t mutex /
    发表于 04-02 14:47 263次阅读

    详谈Linux操作系统编程的互斥mutex

    前文提到,系统如果存在资源共享,线程间存在竞争,并且没有合理的同步机制的话,会出现数据混乱的现象。为了实现同步机制,Linux中提供了多种方式,其中一种方式为互斥mutex(也称之
    的头像 发表于 09-28 15:09 2484次阅读
    详谈Linux操作系统编程的<b class='flag-5'>互斥</b>量<b class='flag-5'>mutex</b>

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

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

    Linux的伤害/等待互斥介绍

    序言:近期读Linux 5.15的发布说明,该版本合并了实时机制,当开启配置宏CONFIG_PREEMPT_RT的时候,这些被基于实时互斥的变体替代:
    的头像 发表于 11-06 17:27 2636次阅读

    什么是Mutex互斥

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

    Linux互斥的作用 互斥是什么

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

    互斥和自旋的实现原理

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