OpenEdv-开源电子网

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

DMA循环模式是否会与CPU读数据冲突

[复制链接]

23

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-11-7
在线时间
2 小时
发表于 2014-1-20 11:47:08 | 显示全部楼层 |阅读模式
程序为DMA读ADC1十六个通道的采样数据,DMA使用循环模式一直读ADC1_DR寄存器数据到ADCDATA[16]。CPU读ADCDATA[]时,如果DMA正在写入,两者会冲突吗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-20 22:59:05 | 显示全部楼层
可能会冲突的。
做双缓冲比较好。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-11-7
在线时间
2 小时
 楼主| 发表于 2014-1-21 08:40:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,具体应该怎么做呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-1-24 15:29:07 | 显示全部楼层
回复【3楼】yyh1910:
---------------------------------
设置A,B  2个缓存数组
1,DMA目的地址首先设置为A。
2,DMA传输完成中断,在中断里面,设置DMA目的地址为B
3,处理数组A里面的数据。
4,DMA传输完成中断,在中断里面,设置DMA目的地址为A
5,处理数组B里面的数据。
.....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-1-17
在线时间
0 小时
发表于 2014-1-24 16:04:45 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

23

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-11-7
在线时间
2 小时
 楼主| 发表于 2014-1-24 16:09:21 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
这办法巧妙!!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2021-7-29
在线时间
1 小时
发表于 2021-7-29 12:32:16 | 显示全部楼层
正点原子 发表于 2014-1-24 15:29
回复【3楼】yyh1910:
---------------------------------
设置A,B  2个缓存数组
1,DMA目的地址首 ...

请教原子哥,用DMA本身就是为了减少中断,避免系统占用,把宝贵的系统时间交给诸如逆变控制之类的刚性实时任务。在这种情况下,如果不用DMA中断,有没有什么好办法避免读写冲突呢?我在实际系统中已经遇到这个问题,会有相当大的概率读出跳变非常大、并且完全无规律的异常数据。已经困扰很久,希望原子哥帮忙解答一下,谢谢!
回复 支持 反对

使用道具 举报

7

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2019-2-17
在线时间
10 小时
发表于 2021-9-1 10:48:28 | 显示全部楼层
amitabha0 发表于 2021-7-29 12:32
请教原子哥,用DMA本身就是为了减少中断,避免系统占用,把宝贵的系统时间交给诸如逆变控制之类的刚性实 ...

,你要是请教我,说不一定就给你说了,可惜呀,可惜。
回复 支持 反对

使用道具 举报

7

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2019-2-17
在线时间
10 小时
发表于 2021-9-1 10:51:56 | 显示全部楼层
不知道CPU和DMA在访问硬件时有没有互斥访问,如果硬件实现了仲裁就不会有问题。
第二硬件的原子访问尺寸,硬件都有最小的原子访问字节大小,比如4字节能访问一次就能读取出来,那就不会数据破坏。
双缓冲,DMA的半传输完成中断与传输完成中断一起用。
回复 支持 反对

使用道具 举报

9

主题

100

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2019-8-15
在线时间
425 小时
发表于 2021-9-1 15:44:03 | 显示全部楼层
建议进行多读几次求平均,求平均前筛选最大值和最小值不要,剩下的求平均。如果真是dma的读写非原子操作,这个方法一定可以避免,否则不是dma读写非原子的问题。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2021-7-29
在线时间
1 小时
发表于 2021-11-20 09:00:20 | 显示全部楼层
美脚诱惑 发表于 2021-9-1 10:48
,你要是请教我,说不一定就给你说了,可惜呀,可惜。

这个互斥访问是没有的,我查遍了厂家datasheet和usermanual,没有查到相关描述。不过你说的确实是宝贵的经验,也可行,十分感谢!顺便说一句,美jio确实很诱惑
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2021-7-29
在线时间
1 小时
发表于 2021-11-20 09:09:40 | 显示全部楼层
鲸鱼niko 发表于 2021-9-1 15:44
建议进行多读几次求平均,求平均前筛选最大值和最小值不要,剩下的求平均。如果真是dma的读写非原子操作, ...

感谢建议,实际项目已经实施此类数据过滤。并且因为检测到的模拟信号叠加很多高频干扰噪声(用在高频大功率逆变控制系统里),然后还得快速响应系统突变,所以情况复杂很多。有时DMA冲突读出的异常数据和正常数据相差不远,再和干扰信号(干扰信号和系统工作频率具有相关性)叠加起来,很难滤除干净。我用了正态分布统计滤波算法、数据平均、均值趋势判断、再加上小波变换才解决问题。无论如何感谢朋友指点,硬件没有支持的情况下,你所说的是唯一解决途径。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 05:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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