DMA工作时,CPU将总线控制权让给DMA了,那CPU能干吗呢?

zhouxiangbai 2017-04-24 09:41:42
DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。通常系统的总线是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态--高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。

我对这种技术有点不明白,就是DMA工作时,CPU是不是就不工作脸?因为CPU把总线控制权让给DMA,它自己就没法工作脸吧?如果真是这样,CPU的效率岂不是很低,没必要使用DMA这样到技术脸。所以我觉得肯定不是这样到,DMA在工作时,CPU也正常工作,问题是CPU能干嘛呢?总线都让给DMA了。请明白人指点一下,谢谢!
...全文
8169 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
paul_yuan 2020-11-25
  • 打赏
  • 举报
回复
三种方法:(1)停止CPU访内存;(2)周期挪用;(3)DMA与CPU交替访问内存. 这三种方法具体怎么设置:我好像还没看到那个单片机有总线仲裁方面的详细资料。 用那种方法:是单片机在设计时就固化好的还是用户可设置的?
paul_yuan 2020-11-25
  • 打赏
  • 举报
回复
音源模块的数据流 流量其实不大。DMA其实会有大量的间歇时间。 但如果DMA的流量需求足够大的话,CPU还能不能从内存取数据就有待进一步验证了。
m0_37237896 2019-06-16
  • 打赏
  • 举报
回复
楼主你的理解是对的,DMA传送方式有三种:停止CPU访问内存,周期挪用,DMA与CPU交替访问;在后两种方式下可以实现并发,同一时刻下还是无法并行。(个人观点)
wuxianhuawxh 2019-04-15
  • 打赏
  • 举报
回复
引用 11 楼 不喝冰 的回复:
百度就知道了 在STM32中是采用这种方法: DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA 同时访问相同的目标(RAM或外设)时, DMA请求会暂停CPU访问系统总线达若干个周期,总线 仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。 DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序.那么DMA控制器与CPU怎样分时使用内存呢?通常采用以下三种方法:(1)停止CPU访内存;(2)周期挪用;(3)DMA与CPU交替访问内存.
这个也只是说访问相同目标时,如果访问不同目标呢?
Android 2018-11-19
  • 打赏
  • 举报
回复
引用 12 楼 taozuiqizhong 的回复:
楼主别结贴啊,问题还没讲明白呢。不是dma和cpu能不能复用总线的问题。
问题是dma控制器搬的并不比cpu快,改用dma搬,cpu让出总线等待。这不是多此一举吗。


还是dma块多了,直接电路搬运,cpu搬运要通过指令系统和寄存器中转,就算dma时cpu完全停下来等,整个算下来也是种的cpu时间减少了
Android 2018-11-19
  • 打赏
  • 举报
回复 1
我也有同样的问题,而且前前后后想了好久,我最后的理解是:在单字节模式下,dma每次只传一个字节,dma虽然占了总线,但是占有的时间极其短,只有几个总线周期而已。如果cpu一个需要用总线的指令比如mov同时运行时,就简单的等待一下而已,等dma释放了总线再继续运行。就是这么简单:)。而且情况可能更好,cpu耗时的指令很多,比如乘法指令这些,相比来说mov这些指令的占用比不大,所以与dma冲突的机会也不会太大,这样cpu和dma几乎在并行工作,用户察觉不出。专业的术语好像叫"总线窃取", "周期挪用"

当然dma还有种模式叫块传送,这种情况下dma占了后,要等大量数据都传完了才释放总线,这种情况下可以认为cpu基本就是停下来等了,就是你疑惑的地方,或者有更高级的技术,比如你说的“分时”来解决。

我个人觉得用单字节dma最好,块传送有点迷糊。
taozuiqizhong 2017-11-30
  • 打赏
  • 举报
回复
楼主别结贴啊,问题还没讲明白呢。不是dma和cpu能不能复用总线的问题。 问题是dma控制器搬的并不比cpu快,改用dma搬,cpu让出总线等待。这不是多此一举吗。
不喝冰 2017-10-28
  • 打赏
  • 举报
回复
百度就知道了 在STM32中是采用这种方法: DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA 同时访问相同的目标(RAM或外设)时, DMA请求会暂停CPU访问系统总线达若干个周期,总线 仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。 DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序.那么DMA控制器与CPU怎样分时使用内存呢?通常采用以下三种方法:(1)停止CPU访内存;(2)周期挪用;(3)DMA与CPU交替访问内存.
zhouxiangbai 2017-05-06
  • 打赏
  • 举报
回复
DMA源端:音频模块的数据FIFO DMA目的端:内存Buffer DMA传输方式:循环列表链表(linked list) 实验结果:启动DMA传输,DMA在不停的从DMA源取数据(因为是传输方式是循环列表,且在传输过程中没有使能任何传输中断),CPU是可以做其他事情的。 问了一下同事,他解释是:芯片是分时给CPU和DMA的,当分时给哪一方时,哪一方就独占总线,另一方被挂起。至于芯片是不是这么设计的、具体怎么设计的,我们都搞不清楚。但是他这样解释我倒是觉得有道理,可以解释我最初的疑惑。 暂时结帖吧,有新的认识在更新。谢谢各位
zhouxiangbai 2017-04-28
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
[quote=引用 楼主 zhouxiangbai 的回复:] DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。通常系统的总线是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态--高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。 我对这种技术有点不明白,就是DMA工作时,CPU是不是就不工作脸?因为CPU把总线控制权让给DMA,它自己就没法工作脸吧?如果真是这样,CPU的效率岂不是很低,没必要使用DMA这样到技术脸。所以我觉得肯定不是这样到,DMA在工作时,CPU也正常工作,问题是CPU能干嘛呢?总线都让给DMA了。请明白人指点一下,谢谢!
A传数据到B CPU模式:通过CPU,CPU从A得到数据,然后CPU再把数据传给B,然后地址+1,处理下下一条数据 DMA模式:AB之间建立通道,地址计数器由DMA管理,A直接到B,地址自动+1, 你说哪种效率高? DMA模式工作时,CPU暂停工作[/quote] 谢谢!待我做个实验再评论
  • 打赏
  • 举报
回复
引用 8 楼 zhouxiangbai 的回复:
[quote=引用 7 楼 worldy 的回复:] [quote=引用 楼主 zhouxiangbai 的回复:] DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。通常系统的总线是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态--高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。 我对这种技术有点不明白,就是DMA工作时,CPU是不是就不工作脸?因为CPU把总线控制权让给DMA,它自己就没法工作脸吧?如果真是这样,CPU的效率岂不是很低,没必要使用DMA这样到技术脸。所以我觉得肯定不是这样到,DMA在工作时,CPU也正常工作,问题是CPU能干嘛呢?总线都让给DMA了。请明白人指点一下,谢谢!
A传数据到B CPU模式:通过CPU,CPU从A得到数据,然后CPU再把数据传给B,然后地址+1,处理下下一条数据 DMA模式:AB之间建立通道,地址计数器由DMA管理,A直接到B,地址自动+1, 你说哪种效率高? DMA模式工作时,CPU暂停工作[/quote] 谢谢!待我做个实验再评论[/quote] 实验做了没有?什么结果?
worldy 2017-04-26
  • 打赏
  • 举报
回复
引用 楼主 zhouxiangbai 的回复:
DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。通常系统的总线是由CPU管理的。在DMA方式时,就希望CPU把这些总线让出来,即CPU连到这些总线上的线处于第三态--高阻状态,而由DMA控制器接管,控制传送的字节数,判断DMA是否结束,以及发出DMA结束信号。 我对这种技术有点不明白,就是DMA工作时,CPU是不是就不工作脸?因为CPU把总线控制权让给DMA,它自己就没法工作脸吧?如果真是这样,CPU的效率岂不是很低,没必要使用DMA这样到技术脸。所以我觉得肯定不是这样到,DMA在工作时,CPU也正常工作,问题是CPU能干嘛呢?总线都让给DMA了。请明白人指点一下,谢谢!
A传数据到B CPU模式:通过CPU,CPU从A得到数据,然后CPU再把数据传给B,然后地址+1,处理下下一条数据 DMA模式:AB之间建立通道,地址计数器由DMA管理,A直接到B,地址自动+1, 你说哪种效率高? DMA模式工作时,CPU暂停工作
zhouxiangbai 2017-04-25
  • 打赏
  • 举报
回复
其实,我可以去做个实验,用DMA进行memory to memory的数据搬移,而且设计成死循环到搬移。 这样,按我的理解,如何DMA是独占总线到话,那么CPU是无法响应其他中断的。 比如通过PC的串口给芯片发送数据,若CPU无法响应串口中断,那么就表明DMA引起CPU被挂起了。若CPU可以响应中断,那么就表明DMA工作期间,CPU没有被挂起的。看脸这个结果之后,再进行分析吧。
zhouxiangbai 2017-04-25
  • 打赏
  • 举报
回复
引用 3 楼 of123 的回复:
[quote=引用 2 楼 zhouxiangbai 的回复:] [quote=引用 1 楼 of123 的回复:] 打个比方。CPU 是北京,你 DMA 的源和目的地是广州和深圳。你真的认为通过 CPU 效率才高吗?
我不明白的地方不是CPU和DMA搬移数据时的效率哪个高,而是当DMA工作时,CPU在干吗?除了cache中的指令可以预取、执行。CPU还能做什么?[/quote] 那要看芯片是如何设计的。如果支持多线程,可能工作于其他方式或其他总线;有些简单的单片机,DMA 时 CPU 就停止工作了。[/quote] 谢谢!还是没明白 单片机就不讨论了,现在的芯片设计是如何设计的呢?总线仲裁和这有关吗? 自己还是没弄明白CPU和DMA的关系,不知道去哪查这方面的资料。
of123 2017-04-24
  • 打赏
  • 举报
回复
打个比方。CPU 是北京,你 DMA 的源和目的地是广州和深圳。你真的认为通过 CPU 效率才高吗?
tjufang 2017-04-24
  • 打赏
  • 举报
回复 1
百度偶然看到的,或许有用;DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
of123 2017-04-24
  • 打赏
  • 举报
回复
引用 2 楼 zhouxiangbai 的回复:
[quote=引用 1 楼 of123 的回复:] 打个比方。CPU 是北京,你 DMA 的源和目的地是广州和深圳。你真的认为通过 CPU 效率才高吗?
我不明白的地方不是CPU和DMA搬移数据时的效率哪个高,而是当DMA工作时,CPU在干吗?除了cache中的指令可以预取、执行。CPU还能做什么?[/quote] 那要看芯片是如何设计的。如果支持多线程,可能工作于其他方式或其他总线;有些简单的单片机,DMA 时 CPU 就停止工作了。
zhouxiangbai 2017-04-24
  • 打赏
  • 举报
回复
引用 1 楼 of123 的回复:
打个比方。CPU 是北京,你 DMA 的源和目的地是广州和深圳。你真的认为通过 CPU 效率才高吗?
我不明白的地方不是CPU和DMA搬移数据时的效率哪个高,而是当DMA工作时,CPU在干吗?除了cache中的指令可以预取、执行。CPU还能做什么?

1,068

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧