【嵌入式 RT-Thread】一种优雅的使用 [互斥锁] 和 [信号量] 解决数据多路并发思路

rt-thread 中的信号量和互斥锁在工业开发项目中的应用,本博文主要介绍了一种优雅的使用 [互斥锁] 和 [信号量] 解决数据多路并发思路
2024-06
by 积跬步、至千里

0. 个人简介 && 授权须知

image-20230911133730620

📋 个人简介

  • 💖 作者简介:大家好,我是喜欢记录零碎知识点的菜鸟打工人。😎
  • 📝 个人主页:欢迎访问我的博客主页🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:嵌入式开发 🍁 🍁
  • 💬格言:写文档啊不是写文章,重要的还是直白!🔥

转载文章,禁止声明原创;不允许直接二次转载,转载请根据原文链接联系作者

若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

作者:积跬步、至千里

image-20230911133724204

符号:

1. 工业场景描述

1.1 工业数据采集需求

  1. 串口1和2接受的数据遵从mudbus协议
  2. 串口1收到modbus指令,第1路传感器采集数据
  3. 串口2收到modbus指令,第2路传感器采集数据
  4. 将采集的数据显示到lcd屏幕上
  5. soc运行RTOS,比如RT-Thread

1.2 总线协议与数据采集

工业上接线图如下所示:
在这里插入图片描述

2. 互斥锁和信号量的应用场合

在这里插入图片描述

3. 使用RT-Thread 的互斥锁和信号量的伪代码

thread_sum_init()
  -> cpuMtx // 初始化互斥锁
  -> sensor_read_thread2()
     -> sensor_read_uart2_routine()
  -> sensor_read_thread3()
     -> sensor_read_uart3_routine()
    

    
sensor_read_uart2_routine()
{
	rx_sem2;  // 创建接收信号量
    // 串口2接收中断中,接收到串口数据则释放信号量 rt_sem_release(rx_sem2);
    while(1)
    {
         // 阻塞,等待 mcu 释放互斥锁,若释放了
         // ===【持有】互斥锁 === 
        rt_mutex_take(cpuMtx, RT_WAITING_FOREVER);
        
        // 阻塞:若串口收到数据,信号量2被释放
        // 传感器1,持有信号量2,采集数据
        
        // 阻塞:若串口收到数据,信号量2被释放
        // 传感器2,持有信号量2,采集数据
       
        // ===释放互斥锁 === 	
    }
}


sensor_read_uart3_routine()
{
    rx_sem3;  // 创建接收信号量
    // 串口3接收中断中,接收到串口数据则释放信号量 rt_sem_release(rx_sem2);
    
    while(1)
    {
         // 阻塞,等待 mcu 释放互斥锁,若释放了
         // ===【持有】互斥锁 === 
        
         rt_mutex_take(cpuMtx, RT_WAITING_FOREVER);
        
        // 阻塞:若串口收到数据,信号量3被释放
        // 传感器1,持有信号量3,采集数据
        
        // 阻塞:若串口收到数据,信号量3被释放
        // 传感器2,持有信号量3,采集数据
        
        // ===释放互斥锁 === 
    }
}

4. 源代码下载链接

gitee 下载链接

https://gitee.com/PokertZhang/rt-thread

  • 18
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步、至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值