硬汉嵌入式论坛

 找回密码
 立即注册
查看: 804|回复: 14
收起左侧

[技术讨论] RTOS开发问题

[复制链接]

7

主题

28

回帖

49

积分

初级会员

积分
49
发表于 2023-12-26 16:46:07 | 显示全部楼层 |阅读模式
想请教各位大哥开发相关的问题:
如果我有一个1k左右的全局变量系统参数(包含挂载的设备列表),在RTOS下,有4个线程,与全局变量之间的关系如下:
1、串口获取数据线程:读取设备列表用于数据获取
2、串口屏处理线程:可以修改挂载的设备列表,需要读取设备列表用于显示
3、以太网上传线程:读取设备列表用于数据上传
4、以太网解析线程:可以修改挂载的设备列表
这4个线程都需要用到这个全局变量,我该如何处理比较好呢?使用一个互斥锁,比较笼统地保护起来整个全局变量还是有更好的方式么?

回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-12-26 16:49:24 | 显示全部楼层
目前的处理方式是,在每次要用到相关变量时,用互斥锁,然后读到一个局部变量,希望各位老哥给指个明路。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106847
QQ
发表于 2023-12-27 08:52:36 | 显示全部楼层
1、变量加前缀__IO, 仅写入的任务加互斥,读取不用管。
2、也可以专门开一个任务管理这个变量,那个任务需要修改,给这个任务发消息。读取的话,直接读。
3、如果每一次操作的变量很少,直接开关中断也可以的。
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-12-27 09:09:55 | 显示全部楼层
硬汉哥,我对第一点还有点问题,如果我是一个数组,写入任务存在互斥,但读取任务优先级更高且触发,这种情况下会不会存在问题。其他两点没问题,谢谢硬汉哥。
回复

使用道具 举报

22

主题

67

回帖

133

积分

初级会员

积分
133
发表于 2023-12-27 10:05:46 | 显示全部楼层
喵小黑 发表于 2023-12-27 09:09
硬汉哥,我对第一点还有点问题,如果我是一个数组,写入任务存在互斥,但读取任务优先级更高且触发,这种情 ...

我个人觉得只要写入互斥了 就没有问题  读取没啥影c响
回复

使用道具 举报

210

主题

1044

回帖

1684

积分

至尊会员

More we do, more we can do.

积分
1684
发表于 2023-12-27 13:00:15 | 显示全部楼层
设计角度避免写并发,有以下方式:1.参数拆分,多数场景下都只会有1处写,2.有并发写的合并到1个任务
回复

使用道具 举报

4

主题

140

回帖

152

积分

初级会员

积分
152
发表于 2023-12-27 13:45:13 | 显示全部楼层
2360985396 发表于 2023-12-27 10:05
我个人觉得只要写入互斥了 就没有问题  读取没啥影c响

为什么保证写互斥就行,读不需要互斥呢
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-12-27 14:57:38 | 显示全部楼层
emwin 发表于 2023-12-27 13:00
设计角度避免写并发,有以下方式:1.参数拆分,多数场景下都只会有1处写,2.有并发写的合并到1个任务

谢谢哥,我去查查相关的文章
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-12-27 15:00:38 | 显示全部楼层
浴火重生 发表于 2023-12-27 13:45
为什么保证写互斥就行,读不需要互斥呢

加一不懂,读的话如果不是原子操作是否也会存在问题?
回复

使用道具 举报

3

主题

124

回帖

133

积分

初级会员

积分
133
发表于 2023-12-27 15:39:35 | 显示全部楼层
喵小黑 发表于 2023-12-27 15:00
加一不懂,读的话如果不是原子操作是否也会存在问题?

8位机读32位应该是会有这个问题的
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-12-27 17:10:50 | 显示全部楼层
skyshine 发表于 2023-12-27 15:39
8位机读32位应该是会有这个问题的

32位读大数组呢?
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-12-27 17:26:40 | 显示全部楼层
skyshine 发表于 2023-12-27 15:39
8位机读32位应该是会有这个问题的

那假如是32位机读大数组呢?
回复

使用道具 举报

22

主题

67

回帖

133

积分

初级会员

积分
133
发表于 2023-12-28 17:06:15 | 显示全部楼层
浴火重生 发表于 2023-12-27 13:45
为什么保证写互斥就行,读不需要互斥呢

因为读的时候 只要没有写 不管你多少个任务读取 值都是一定的  互斥本质是为了防止读写同时操作 造成读的值和写的值不一致
回复

使用道具 举报

3

主题

96

回帖

105

积分

初级会员

积分
105
发表于 2023-12-28 18:30:47 | 显示全部楼层
读的时候先copy一份数据,如何统一读备份的数据就行了。写的时候要互斥就行了。
回复

使用道具 举报

14

主题

62

回帖

104

积分

初级会员

积分
104
发表于 2024-1-20 09:38:02 | 显示全部楼层
eric2013 发表于 2023-12-27 08:52
1、变量加前缀__IO, 仅写入的任务加互斥,读取不用管。
2、也可以专门开一个任务管理这个变量,那个任务需 ...

读取也需要互斥吧,否则有概率出现读取线程获取的数据中 一半新包一半旧包
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 12:54 , Processed in 0.200833 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表