直接内存访问的优点是什么?

What is the advantage of direct memory access?

如果 CPU 在 DMA 传输期间无法访问总线,因此必须等待总线被释放,使用 DMA 如何提供任何性能优势?

可能存在总线争用,但它仍然可能比通常由中断驱动 I/O 的替代方案更快,后者具有巨大的软件开销。通常,DMA 传输不会使用最大内存带宽(可能除了内存到内存的传输),因为外围设备往往比内存慢得多。 DMA 控制器将 交错 CPU 访问。

此外,总线争用不是给定的,许多微控制器将它们的内存分段在单独的总线上,因此 CPU 对一条总线上的内存的访问可以与另一条总线上的内存中的 DMA 操作同时发生。例如,哈佛架构设备具有用于代码和数据存储器的独立总线,因此可以同时获取操作码和数据,但减少了数据存储器的访问负载(因为并非所有指令都需要获取存储器操作数)有利于 DMA。

此外,一些微控制器,例如 STM32 系列中的许多微控制器(Cortex-M 以及哈佛架构)将其片上 SRAM 分段到单独的总线上(以及单独总线上的外部存储器接口)。通常会有一些比其他段更小的 SRAM 段——可能是 4K 或 16K——这是专门用于 DMA 缓冲的理想选择。以这种方式使用内存可以避免总线争用,从而对性能产生重大影响。

一些STM32部件的另一个特性是核心耦合存储器 (CCM),它不适用于DMA或位带,但如果用于大多数CPU数据处理,使其他片上 SRAM 可用于 DMA,进一步减少总线争用。

其他微处理器可能有类似的内存分段。要利用这种内存架构,您通常需要自定义链接器脚本和代码中可能的链接器指令,以允许识别段并将对象显式分配给它们。这将是特定于工具链的。