OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4948|回复: 2

RTOS共享内存问题

[复制链接]

14

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2015-7-22
在线时间
122 小时
发表于 2018-5-10 11:05:17 | 显示全部楼层 |阅读模式
1金钱
最近在将一个协议栈移植到FreeRTOS系统上。之前的协议栈是基于前后台系统开发的,在串口接收中断将接收到的数据写入一个环形缓存区,再根据协议从这个缓存区中读出一帧数据,将数据转义和解析,将最后解析出的消息写入一个接收消息环形缓存区;发送数据时,将数据打包成一条消息并写入消息发送缓存区,从消息发送缓存区读出一条消息后,封包,转义,写入串口发送队列,通过轮询或者中断形式将数据发送出去。这里面的环形缓存区全部都是用全局数组做的,在前后台系统中使用没有什么问题。那么移植到RTOS环境下时,有诸多疑问如下:
1.串口接收缓存区和发送缓存区使用全局数组问题应该不大,因为不管什么时候只会有一个任务对这块内存进行读写。一个任务或者ISR读,一个任务或者ISR写。这样理解是否正确?

2.如果将上述前后台编程思想写出的协议栈移植到RTOS下,为了移植方便,是不是紧紧需要消息发送buf的操作做临界区护就行?因为在RTOS下会有多个任务需要往消息发送缓存中填写数据。这块消息发送缓存实质上就变成了若干任务的共享内存。当访问该内存时虽然可以进行临界区保护(原子操作),但是貌似还是会出问题!比如A任务在访问这块共享内存的时候,B任务也需要访问,但是此时操作被保护了,那就只能等到A任务访问结束后才能访问。这是不是就意味着A在写入数据的整个过程中都不能被打断(整个写入数据的函数都需要被临界保护),一但写入的数据过多,过于频繁是不是就会严重影响系统的实时性?这样是不是意味着使用RTOS的情况下,共享内存的形式不是很适用?

3.按RTOS的思维的话是不是应该发送消息缓存设计成消息队列?需要写入数据的任务通过消息队列将数据发送给发送任务?

总的来说,全局数组和全局变量之类的数据结构会对RTOS带来什么样的影响?


work is work!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2013
金钱
2013
注册时间
2017-12-11
在线时间
450 小时
发表于 2018-5-10 11:29:48 | 显示全部楼层
发送缓冲区和接收缓冲区共享一块内存吗?
如果不是。
如果换成是我来做。
我会将所有发送数据到发送缓冲区的合并为一个任务。既然操作发送缓冲区的只有一个任务,那么久没必要对发送缓冲区进行保护了。
操作接收缓冲区的,也是同一个道理。

回复

使用道具 举报

14

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2015-7-22
在线时间
122 小时
 楼主| 发表于 2018-5-10 14:00:16 | 显示全部楼层
bootblack 发表于 2018-5-10 11:29
发送缓冲区和接收缓冲区共享一块内存吗?
如果不是。
如果换成是我来做。

发送缓存和接收缓存是不同的两块内存。是有多个任务需要往发送缓存中写入数据。比如A任务是AD采集任务,B任务是温度采集任务,C任务是IC读卡任务,现在需要将这三组数据传送到另外一个MCU上去。那A任务需要将采集到的数据写入消息发送缓存进行发送,B、C任务也一样。所以称这三个任务共用消息发送缓存内存。在前后台系统中,我们可以不必考虑太多,因为后台只能被前台打断,但是前台也不会去操作这块内存,所以我可以把写共享内存的操作写成一个统一的接口;RTOS环境下如果使用全局数组这种共享内存的形式貌似会破坏系统的稳定性和实时性。我是这么理解的,不知道对不对。另外想问下小伙伴们,对于RTOS中串口啊、Can啊之类的你们有没有实现过类似的协议栈,然后呢是规划成一个大任务形式还是说分解成好几个任务?谢谢。
work is work!!!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 23:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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