最近在研究DMA,我对DMA的认识是:一个搬运工,让CPU减少搬运数据的操作,腾出时间多做运算,提高运行速度。
但对手册中的一段对DMA总线占用情况的描述不太清楚。
我对上面功能描述的理解是这样的:比如用DMA来将ADC采集模拟量到SRAM
那么ADC会经过总线到SRAM,在数据经过总线的时候,CPU就无法与总线交互,因此M3核采取分时复用,让CPU也有一半的时间能够使用总线。
那么问题来了,DMA传输中,总线一半可用,那么是不是会影响CPU 的运行速度?影响程度有多大?如果影响速度的话,那么什么场景下才适合用DMA? 如果不影响速度的话,是为什么?
下面的文章比较好的描述了一下DMA的工作过程:
微信公众平台 (qq.com)https://mp.weixin.qq.com/s/c1bfv55cByw_00_c6ypasA
在一篇STM32L15x DMA介绍的PDF中,可以看到,他们考虑到了这个问题。采用的方法是限制DMA单次传输占用总线的周期,来达到CPU有机会使用总线的空挡。
因此,DMA传输中会占用总线,不管什么策略,都是有可能会阻塞CPU读取总线的操作的,但是对执行效率和速度的影响要看具体芯片的实现,有的影响很小。因此,在项目中采用DMA时,要谨慎。
2024.01.10更新:
(26 封私信 / 83 条消息) dma占用系统总线时,cpu不能访存,也就无法取值,这是否与dma与cpu并行工作矛盾? - 知乎 (zhihu.com)
这条知乎回答我觉得很全面了。