如果在DMA传输期间CPU无法访问总线,则必须等待总线释放,使用DMA如何带来性能优势?
可能存在总线争用,但是它可能比通常由中断驱动的I / O(具有巨大的软件开销)的替代方法更快。通常,DMA传输不会使用最大内存带宽(也许除了内存到内存的传输外),因为外围设备往往比内存慢得多。DMA控制器将交错 CPU访问。
此外,总线争用不是给定的,许多微控制器在单独的总线上分段其存储器,因此CPU对一条总线上的存储器的访问可以与另一条总线上的DMA操作同时发生。例如,哈佛体系结构设备具有用于代码和数据存储器的独立总线,因此可以同时获取操作码和数据,但是减少了数据存储器上的访问负载(因为并非所有指令都需要获取存储器操作数),因此具有DMA的优势。
此外,一些微控制器,例如STM32系列中的许多微控制器(Cortex-M,也是哈佛架构),将其片上SRAM划分在单独的总线上(以及在单独的总线上的外部存储器接口)。通常,SRAM的某个部分要比其他部分小一些-也许是4K或16K-非常适合DMA缓冲专用。通过避免总线争用,以这种方式使用内存会对性能产生重大影响。
某些STM32部件的另一个功能是内核耦合存储器(CCM),该内核耦合存储器(CCM)不可用于DMA或位带,但如果用于大多数CPU数据处理,则可将其他片上SRAM用于DMA,从而进一步减少了总线争用。
其他微处理器可能具有类似的内存分段。要利用这种内存体系结构,通常需要在代码中使用自定义的链接描述文件和链接描述,以允许识别段和将对象明确分配给它们。这将是特定于工具链的。
“通常是由中断驱动的I / O的替代方案” -实际上是编程的I / O。请参阅dma vs中断驱动的I / o。
@sawdust我明白您的意思,但这更笼统。由于某种原因,我通常“包括”了警告。我并不是说这与DMA相反,只是一种替代。这是“典型的”,因为轮询的I / O不允许进行相同的背景/前景处理,因此可比性较差的替代方法也是如此。