当数据量较小时,内存到内存 DMA 传输是不是存在权衡?

Posted

技术标签:

【中文标题】当数据量较小时,内存到内存 DMA 传输是不是存在权衡?【英文标题】:Is there a trade-off for memory to memory DMA transfer when the data size is small?当数据量较小时,内存到内存 DMA 传输是否存在权衡? 【发布时间】:2020-08-26 15:09:29 【问题描述】:

我正在学习 STM32 F4 微控制器。我试图找出使用 DMA 的限制。

根据我的理解和研究,我知道如果数据量很小(即设备使用 DMA 生成或消耗少量数据),开销会增加,因为 DMA 传输需要 DMA 控制器执行操作,从而不必要地增加系统成本。

我做了一些研究,发现以下内容:

DMA 的限制

CPU 将其所有线路置于高阻抗状态,以便 DMA 控制器可以直接在设备和内存之间传输数据,而无需 CPU 干预。显然,它更适合磁盘等具有高数据传输率的设备。 通过串行接口,数据一次传输一位,这使得使用 DMA 很慢。

正确吗?我还需要知道什么?

【问题讨论】:

根据您对“开销”的定义(具体是什么,指令、速度、功耗……?),这可能是真的。为 STM32F4 上的内存到内存传输设置 DMA 控制器至少需要 4 次外设寄存器写入,这将需要几个 CPU 周期。因此,对于较小的数据大小,这实际上可能比让 CPU 复制它的性能更差。 您的问题无法回答。 DMA 是内置的,没有额外的“系统成本”。 DMA 用例是如此不同 - 答案仅在实际应用程序级别上是可能的,但通常不是。 IMO 作为初学者,您应该避免任何微优化注意事项。 关于您的系统是如何设计的(我想它是一个嵌入式板系统?)或您的用例,您还没有告诉我们很多。但是这个链接可能会有所帮助:embedds.com/using-direct-memory-access-dma-in-stm23-projects 你是对的,它是一个 stm32f4 我相信学习目标是阅读STM32F4参考手册[RM0090],(特别是第10节(DMA))结合“使用stm32 f2/f4/f7”应用笔记@987654323 @ 并讨论配置选项和性能注意事项。 【参考方案1】:

DMA -CPU 将其所有线路置于高阻抗状态

我不知道你是从哪里得到的——但你不应该再使用这个来源了。

除非您达到 BUS 吞吐量,否则 DMA 传输的频率无关紧要。你可以每周、每月、每年、每十年传输一个字节......绝对没问题。

在 STM32 微控制器中,这是一个非常重要的功能,因为即使 uC 处于内核 (CPU) 休眠的低功耗模式,我们也可以将数据从外部设备传输到外部设备。 DMA 控制器甚至可以在满足某些条件时唤醒内核。

【讨论】:

关于将 DMA 传输用于慢速周期性数据的限制,还有其他建议参考吗?【参考方案2】:

正如@Vinci 和@0___________(f.k.a. @P__J__)已经指出的那样,

    DMA 控制器自主工作,不会在它所补充的 CPU 上产生开销(至少不会自己产生开销)。但是:

    CPU/软件必须执行一些指令来配置 DMA 并触发它或让它由某些外围设备触发。为此,它需要 CPU 时间和程序存储空间(通常是 ROM)。此外,它通常需要一些额外的 RAM 变量来管理 DMA 周围的软件。

    因此,您是对的,使用 DMA 会带来一些开销。

此外,

    DMA 传输使用将相关内存/寄存器/外设连接到 DMA 控制器的内存总线。也就是说,当 DMA 控制器完成自己的工作时,它可能会导致它试图卸载的 CPU 在此期间停止,至少在传输数据字时的短时间内(这反过来总结更长的传输...... .).

另一方面,DMA 不仅可以帮助您减少 CPU 负载(关于实现某些功能的总 CPU 时间)。如果以“聪明的方式”使用,它可以帮助您减少实现不同功能的软件延迟,因为实现的一部分可以“隐藏”在另一部分的 DMA 驱动数据传输之后(除非两者都依赖于同一总线资源 - 见上文...)。

【讨论】:

内核优先于 DMA。它几乎不引人注意。另一方面,DMA 将被核心访问“停止”。为了防止它(对于真正密集和时间关键的 DMA 事务)在核心以外的其他内存段上运行。【参考方案3】:

信息是正确的,因为使用 DMA 需要一些开发工作和一些运行时来管理 DMA 传输本身(另请参阅 a related question 这里),这可能不值得使用 DMA 的好处。也就是说,对于一小部分数据,一个人不会像在大传输期间获得那么多的性能(或延迟)。在嵌入式系统上,DMA 控制器(及其通道)是有限的资源,因此重要的是要考虑功能的哪一部分最能从这种资源中受益。因此,人们通常更喜欢使用 DMA 来进行与磁盘之间的数据传输(如果是关于“有效负载数据”,例如大文件或视频流),而不是慢速串行连接。

信息是错误的,然而,DMA 不值得在串行接口上​​使用,因为它们一次只传输一个位。请注意,微控制器(作为您的 STM32F4) 具有内置的外围组件,可将串行逐位流转换为逐字节或逐字流,DMA 可以轻松地以一种有用的方式传输这些流 - 特别是如果数据包的大小预先知道,软件不必分析非格式化流。此外,并非每个串行连接都“慢”。如果项目使用,e。 g.,一个 SPI flash 芯片,那么 SPI 串行连接 用于数据传输。

【讨论】:

链接和答案具有误导性。 “因为 DMA 不值得在串行接口上​​使用,因为它们一次只传输一个位” - 这是没有意义的,因为 DMA 只传输最小字节数。 是的,这就是为什么我写这样的信息是错误的。 对于使用 DMA 传输慢速周期性数据的限制,您还有其他建议参考吗?我希望可以了解更多。 @P__J__ 请重新阅读 HelpingHand 所说的内容。听起来你们俩都在 AGREEMENT 中;) Jia Hoo Loh - 您已经得到了答案:如果您愿意付出努力,DMA 传输将有所帮助(如果只是通过卸载 CPU ),无论数据多么少,或者您发送它的频率如何。

以上是关于当数据量较小时,内存到内存 DMA 传输是不是存在权衡?的主要内容,如果未能解决你的问题,请参考以下文章

STM32F429第二十七篇之DMA

STM32F429第二十七篇之DMA

STM32 DMA简述

Zephry DMA驱动使用教程(内存到内存)

Zephry DMA驱动使用教程(内存到内存)

对IOMMU 和 vIOMMU 的简单理解