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

    文章

    1483

    浏览量

    74525
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118798

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

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

收藏 人收藏

    评论

    相关推荐

    Linux高级编程---互斥

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

    RT-thread内核之互斥

    一、互斥量控制块:在include/rtdef.h#ifdef RT_USING_MUTEX/** * Mutual exclusion (mutex) structure */st
    发表于 03-06 17:23

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

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

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

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

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

    实现在 liteos_imp.c文件:接口名功能描述osal_mutex_create创建互斥osal_mutex_del删除
    发表于 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开发板鸿蒙OS内核编程开发——互斥

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

    互斥量源码分析测试

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

    鸿蒙内核实现用户态快速互斥Futex设计资料合集

    Futex(Fast userspace mutex,用户态快速互斥),系列篇简称 快 ,是一个在 Linux 上实现锁定和构建高级抽象
    发表于 03-23 14:12

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

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

    Linux多线程同步互斥Mutex详解

    嵌入式linux中文站向各位爱好者介绍linux常见同步方式互斥Mutex的使用方法1. 初始化:在Linux下, 线程的互斥量数据类型是pthread_mutex
    发表于 04-02 14:45 232次阅读

    Linux 多线程互斥互斥

    情况是指可以允许多个访问者同时访问资源互斥Mutex:本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥互斥
    发表于 04-02 14:47 201次阅读

    ThreadX(七)------互斥Mutex

    这里写目录标题概述API二级目录三级目录概述APItx_mutex_createtx_mutex_deletetx_mutex_gettx_mutex_put二级目录三级目录
    发表于 12-28 19:29 8次下载
    ThreadX(七)------<b class='flag-5'>互斥</b>量<b class='flag-5'>Mutex</b>

    什么是Mutex互斥

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