rt-thread 中的信号量和互斥锁在工业开发项目中的应用,本博文主要介绍了一种优雅的使用 [互斥锁] 和 [信号量] 解决数据多路并发思路
2024-06
by 积跬步、至千里
目录
- 0. 个人简介 && 授权须知
- 1. 工业场景描述
- 1.1 工业数据采集需求
- 1.2 总线协议与数据采集
- 2. 互斥锁和信号量的应用场合
- 3. 使用RT-Thread 的互斥锁和信号量的伪代码
- 4. 源代码下载链接
0. 个人简介 && 授权须知
📋 个人简介
- 💖 作者简介:大家好,我是喜欢记录零碎知识点的菜鸟打工人。😎
- 📝 个人主页:欢迎访问我的博客主页🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:嵌入式开发 🍁 🍁
- 💬格言:写文档啊不是写文章,重要的还是直白!🔥
转载文章,禁止声明原创;不允许直接二次转载,转载请根据原文链接联系作者
若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。作者:积跬步、至千里
符号:
❌
✅
1. 工业场景描述
1.1 工业数据采集需求
- 串口1和2接受的数据遵从
mudbus
协议 - 串口1收到
modbus
指令,第1路传感器采集数据 - 串口2收到
modbus
指令,第2路传感器采集数据 - 将采集的数据显示到
lcd
屏幕上 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