当数据量较小时,内存到内存 DMA 传输是否存在权衡?
Is there a trade-off for memory to memory DMA transfer when the data size is small?
我正在学习STM32 F4微控制器。我正在尝试了解使用 DMA 的限制。
根据我的理解和研究,我知道如果数据量较小(即设备使用 DMA 生成或消耗少量数据),则开销会增加,因为 DMA 传输需要 DMA 控制器执行操作,从而不必要地增加系统成本。
我做了一些研究并发现了以下内容:
Limitation of DMA
CPU puts all its lines at high impedance state so that the DMA controller can then transfer data directly between device and memory without CPU intervention. Clearly, it is more suitable for device with high data transfer rates like a disk.
Over a serial interface, data is transferred one bit at a time which makes it slow to use DMA.
对吗?我还需要知道什么?
正如@Vinci 和@0___________(f.k.a。@P__J__)已经指出的那样,
DMA 控制器自主工作,不会在其补充的 CPU 上产生开销(至少不会单独产生)。但是:
CPU/software 必须执行一些指令来配置 DMA 并触发它或由某些外设触发它。为此,它需要 CPU 时间和程序存储器 space(通常是 ROM)。此外,它通常需要一些额外的RAM变量来管理围绕DMA的软件。
因此,您是对的,使用 DMA 会带来一些开销。
此外,
- DMA 传输利用内存总线将所涉及的 memories/registers/peripherals 连接到 DMA 控制器。也就是说,当 DMA 控制器做它自己的工作时,它可能会导致它试图卸载的 CPU 同时停止,至少在传输数据字的短时间内(这反过来总结为更长的传输...)。
另一方面,DMA 不仅可以帮助您减少 CPU 负载(关于实现某些功能的总 CPU 时间)。如果“以一种聪明的方式”使用,它可以帮助您减少软件延迟以实现不同的功能,因为实现的一部分可以“隐藏”在另一部分的 DMA 驱动数据传输之后(除非两者都依赖于相同的总线资源 - 见上文...)。
信息是正确的,因为使用 DMA 需要一些开发工作和一些运行时来管理 DMA 传输本身(另请参阅
在这里),这可能不值得使用 DMA 的好处。也就是说,对于小部分数据,人们不会获得与大传输期间一样多的性能(或延迟)。在嵌入式系统上,DMA 控制器(及其通道)是有限的资源,因此重要的是要考虑功能的哪一部分从这种资源中获益最多。因此,人们通常更喜欢使用 DMA 进行数据传输 to/from 磁盘(如果大约 "payload data",例如大文件或视频流)而不是慢速串行连接。
信息是错误的,但是,DMA 不值得在串行接口上使用,因为它们一次只传输一位。请注意,微控制器(作为您的
STM32F4)
具有将串行逐位流转换为逐字节或逐字流的内置外围组件,可以通过 DMA 以有用的方式轻松传输 - 特别是如果数据包的大小是事先知道的,软件不必分析非格式化流。此外,并非每个串行连接都是 "slow"。如果项目使用,e。 g.,一个SPI闪存芯片,那么SPI串行连接是用于数据传输的
DMA -CPU puts all its lines at high impedance state
我不知道你从哪里得到它 - 但你不应该再使用这个来源。
除非您达到总线吞吐量,否则 DMA 传输的频率无关紧要。你可以每周、每月、每年、每十年传输一个字节..... 绝对可以。
在 STM32 微控制器中,这是一个非常重要的功能,因为我们可以传输数据 from/to 外部设备,即使 uC 处于低功耗模式且内核 (CPU) 正在休眠。 DMA 控制器甚至可以在满足某些条件时唤醒内核。
我正在学习STM32 F4微控制器。我正在尝试了解使用 DMA 的限制。
根据我的理解和研究,我知道如果数据量较小(即设备使用 DMA 生成或消耗少量数据),则开销会增加,因为 DMA 传输需要 DMA 控制器执行操作,从而不必要地增加系统成本。
我做了一些研究并发现了以下内容:
Limitation of DMA
CPU puts all its lines at high impedance state so that the DMA controller can then transfer data directly between device and memory without CPU intervention. Clearly, it is more suitable for device with high data transfer rates like a disk. Over a serial interface, data is transferred one bit at a time which makes it slow to use DMA.
对吗?我还需要知道什么?
正如@Vinci 和@0___________(f.k.a。@P__J__)已经指出的那样,
DMA 控制器自主工作,不会在其补充的 CPU 上产生开销(至少不会单独产生)。但是:
CPU/software 必须执行一些指令来配置 DMA 并触发它或由某些外设触发它。为此,它需要 CPU 时间和程序存储器 space(通常是 ROM)。此外,它通常需要一些额外的RAM变量来管理围绕DMA的软件。
因此,您是对的,使用 DMA 会带来一些开销。
此外,
- DMA 传输利用内存总线将所涉及的 memories/registers/peripherals 连接到 DMA 控制器。也就是说,当 DMA 控制器做它自己的工作时,它可能会导致它试图卸载的 CPU 同时停止,至少在传输数据字的短时间内(这反过来总结为更长的传输...)。
另一方面,DMA 不仅可以帮助您减少 CPU 负载(关于实现某些功能的总 CPU 时间)。如果“以一种聪明的方式”使用,它可以帮助您减少软件延迟以实现不同的功能,因为实现的一部分可以“隐藏”在另一部分的 DMA 驱动数据传输之后(除非两者都依赖于相同的总线资源 - 见上文...)。
信息是正确的,因为使用 DMA 需要一些开发工作和一些运行时来管理 DMA 传输本身(另请参阅
信息是错误的,但是,DMA 不值得在串行接口上使用,因为它们一次只传输一位。请注意,微控制器(作为您的 STM32F4) 具有将串行逐位流转换为逐字节或逐字流的内置外围组件,可以通过 DMA 以有用的方式轻松传输 - 特别是如果数据包的大小是事先知道的,软件不必分析非格式化流。此外,并非每个串行连接都是 "slow"。如果项目使用,e。 g.,一个SPI闪存芯片,那么SPI串行连接是用于数据传输的
DMA -CPU puts all its lines at high impedance state
我不知道你从哪里得到它 - 但你不应该再使用这个来源。
除非您达到总线吞吐量,否则 DMA 传输的频率无关紧要。你可以每周、每月、每年、每十年传输一个字节..... 绝对可以。
在 STM32 微控制器中,这是一个非常重要的功能,因为我们可以传输数据 from/to 外部设备,即使 uC 处于低功耗模式且内核 (CPU) 正在休眠。 DMA 控制器甚至可以在满足某些条件时唤醒内核。