硬汉嵌入式论坛

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

[技术讨论] 在使用STM32和环形缓冲区时,DMA绕过环形缓冲区写入函数直接写入数据而造成的数据覆盖该怎么解决?

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2026-3-17 22:32:45 来自手机 | 显示全部楼层 |阅读模式
在使用lwrb环形缓冲区组件移植到stm32f103使用的时候发现,直接用dma将串口数据搬运到环形缓冲区,而不是使用库给的write函数的时候(也就是绕过环形缓冲区相关库的写入),如果缓冲区过小(或者数据过快过大),那么很容易造成新数据覆盖旧数据的现象而没有提醒和警报。

于是我在dma和环形缓冲区直接又设置了一个数组,先将数据搬到小数组里,再通过中断服务函数使用环形缓冲区库中的写入函数lwrb_write,将小数组内容再写入缓冲区中,并判断剩余空间来进行保护。但这样感觉跟又回到没使用环形缓冲区的情况下了,感觉哪里不太对。

设置缓冲这个办法可行吗,还有没有其他更好的办法呢?
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2026-3-17 22:33:40 来自手机 | 显示全部楼层
萌新求解答
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
122007
QQ
发表于 2026-3-18 09:56:21 | 显示全部楼层
DMA配合环形效果一般,可以考虑使用DMA双缓冲足够用,这个比较方便。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2026-3-18 15:17:01 来自手机 | 显示全部楼层
eric2013 发表于 2026-3-18 09:56
DMA配合环形效果一般,可以考虑使用DMA双缓冲足够用,这个比较方便。

确实!大佬说的很有道理,我后来也是感觉双缓冲感觉适合,DMA的半满中断和全满中断与双缓冲十分契合。我后来甚至在DMA搬运数组又中使能了半满中断,不过感觉十分杂糅(哭笑),具体见https://www.zhihu.com/question/2017298694035240806?share_code=1rGdvbMcust6s&utm_psn=2017606732738733567
回复

使用道具 举报

3

主题

17

回帖

26

积分

新手上路

积分
26
发表于 2026-3-20 14:28:56 | 显示全部楼层
我是DMA加双缓存或多个缓存
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-12 20:55 , Processed in 0.366252 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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