OpenEdv-开源电子网

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

DMA相关疑问请解答,多年疑惑!!!

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2023-5-16
在线时间
3 小时
发表于 2023-7-12 09:50:57 | 显示全部楼层 |阅读模式
问题一:查看资料都说DMA不需要CPU干预,可以减少资源的浪费。但是资料也说DMA和CPU不能同时占用总线。有三种方式:
a.完全抢占,dma期间cpu停止运行
b.dma和cpu同时跑,cpu可以处理一些和总线无关的操作。
c.轮询执行
我的疑问是无论是abc哪一种,都无法做到dma和cpu同时运行。就像rtos多任务一样,虽然看起来是同时再跑,其实不是这样的。那dma不就没啥用了吧,反正cpu也是闲着,让cpu去做不是也一样吗还有就是怎么知道芯片具体使用哪一种方式?


问题二:
dma的搬运速度由谁决定的,像内存拷贝那么快吗?举例:串口发送使用DMA,假设波特率是9600。也就是每秒9600/8=1200个字节。假设串口发送1200个字节,那么dma搬运是不是需要1s时间,也就是dma搬运完成的中断需要1s后发生?还是dma瞬间就将1200字节搬运完成了,是微妙级别的。波特率越高,同样搬运1200字节的时间是不是越短?

问题三:
假设dma搬运速度由波特率决定,那么9600下搬运1200字节需要1s,结合问题1,cpu运行被延后了1s?

问题四:
对于i2s或者spi等其他协议,dma的搬运速度是不是由这些协议的比特率决定的?不然瞬间就搬运完了,数据还没发送输出,随着时间的推移不是就出问题了吗?

问题五:
dma在搬运的过程中,假设由其他中断产生,cpu会收到中断吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5259
金钱
5259
注册时间
2012-8-25
在线时间
1025 小时
发表于 2023-8-26 09:36:45 | 显示全部楼层
你开了一个工厂,有仓库和车间.原来公司小,很多事都要自己做.
每次车间要物料,他就来找你说:老板,需要毛坯5件,然后你就去点数,
出库.那其他人找你只能等你把这件事完成了才可以.

后来公司大了,你招了专职的仓库管理员(dma).你就对车间和仓库说,
这批产品要生产100件,你们交接下,做完了来汇报.(dma启动)
然后车间每次领料直接找仓库管理员.然后就不用你干预了,出库完100件,
仓库来报告(dma中断),车间完成100件生产(外围中断如spi中断).
这期间你不被他们打扰.
回复 支持 1 反对 0

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8461
金钱
8461
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-7-13 17:20:43 | 显示全部楼层

回帖奖励 +1 金钱

我的理解:
1.在某种程序上DMA和CPU是独立的,同时运行,但由于某些资源(如RAM)在同一时刻只能有一方访问,另一方就得等等;比如复制一个数组到另一个数组,让CPU去做的话需要写个循环程序,就浪费了很多时钟周期,DMA会快些。
2.dma的搬运速度就是像内存拷贝那么快。串口较特殊,需等待发完一字节后才可发送下一字节,一般利用发送完成的条件来触发DMA搬运下一字节到发送寄存器。9600发送一字节约1ms,波特率越高,需要的时间越短。若用其它条件来触发DMA,也可以在一瞬间将1200字节般运到发送寄存器,但是实际上串口硬件可能只发出了一个字节,这肯定不是你想要的。
3.搬运速度不由波特率决定,不会延迟那么多。
4.所以需要设置好DMA的触发条件,条件达成才会进行一次搬运。
5.DMA几乎不影响不相关中断。
傲游截图20230713171945.jpg

专治疑难杂症
回复 支持 反对

使用道具 举报

0

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2023-5-17
在线时间
28 小时
发表于 2023-8-10 13:41:29 | 显示全部楼层
ST官方有DMA的解答的,可以去看看
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2023-7-20
在线时间
9 小时
发表于 2023-9-6 19:57:27 | 显示全部楼层
qq1646544 发表于 2023-8-10 13:41
ST官方有DMA的解答的,可以去看看

能指个路吗
回复 支持 反对

使用道具 举报

0

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2023-5-17
在线时间
28 小时
发表于 2023-9-19 14:04:26 | 显示全部楼层

1、如果有两个主设备(如DMA1和CPU、DMA1和DMA2)同时访问同一个从设备(如串口等),STM32所采用的的是循环调度优先级方案,只对从设备所在的总线进行循环仲裁,不会影响到其他从设备的访问,对于在同一DMA内的不同数据流同时刻访问的情景,采用软件仲裁和硬件仲裁两种方案,先软件仲裁(DMA可以设置优先级别),后硬件仲裁(数据流数字越小的,优先级越高)。,并不是a、b、c三种中的任何一种。
234、DMA搬运需要考虑到总线是否有竞争访问,我们以串口到内存搬运举例,DMA需要进行两次访问,第一次访问是在串口部分,DMA所做的工作是,询问是否需要仲裁,串口地址计算,以及将串口数据搬运到DMA中,第二次访问是在内存部分,需要做的是询问是否需要仲裁,内存地址计算,以及将数据搬运到内存中,所以搬运的速度和串口波特率并不是相关的。
5、这个问题很简单,DMA又是协处理器,和CPU可以说是同等地位的,所以DMA的工作过程,不会影响到CPU收到中断的通知的,可以去仔细看看内核手册。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 05:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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