直接内存访问 DMA 优缺点

在一些系统应用中,微处理器可能会遇到一些限制和瓶颈。比如,当处理器需要管理一个不断发送数据的模数转换器( ADC )时,处理器可能会被频繁中断,导致它很难完成其他任务。

为了解决这个问题,引入了一种被称为直接内存访问( DMA )的技术。DMA 可以帮助处理器在大规模或高速数据处理的任务中移动数据,并尽量减少处理器的参与。可以将DMA控制器看作是一个辅助处理器,它的唯一任务就是与存储器和外部设备进行数据交互。

通过使用 DMA,主处理器可以成功地管理工作量较大的外设,而不需要过多地参与其中。这样,处理器就可以专注于处理其他任务,甚至在后台处理数据时进入睡眠状态,以节省功耗。例如,在 Arm®架构上,DMA 模块可以在低功耗模式下运行,从而延长电池的使用寿命。

对于一些需要长时间电池寿命的应用,比如可穿戴传感器和智能手表,使用 DMA 技术可以带来明显的优势。通过减少处理器的负担和功耗,系统可以更高效地工作,同时延长电池的使用时间。这对于用户来说是非常有益的。

总结一下 DMA 优缺点:

DMA 优点
CPU 时间 DMA 可以最大限度减少需要处理器执行和中断的频率,缩短处理数据需要耗费的 CPU 时间。
功耗 如果 DMA 允许处理器在 DMA 传输期间进入睡眠模式,则有机会尽可能降低功耗。
并联的操作 根据系统总线的架构情况,处理器可以在执行外设事务时执行其他操作。
DMA 缺点
成本 在系统中集成 DMA 需要用到 DMA 控制器,这会使系统成本更加高昂。
复杂性 虽然 DMA 可以降低中断频率,但它会使应用固件的大小和复杂性增加。
对平台的依赖性 不同制造商生产的 DMA 控制器以及同一制造商生产的不同 DMA 控制器,其内部架构不同,根据它们本身的总线访问方案,行为特性也会不同。
缓存区的不连续性 在写入存储器体系的缓存层时,DMA 事务可能导致逻辑错误。使用缓存连贯的系统架构或在 DMA 完成时使缓存无效可以解决这一问题。

在处理 DMA 事务时,可能会出现与缓存层的存储器系统冲突的问题。这种冲突可能导致逻辑错误的发生。为了解决这个问题,可以采取一些方法来确保系统的缓存一致性。

尽管 DMA 控制器在嵌入式系统中非常有用,但是在实际应用中,我们需要根据具体情况选择合适的方案来确保数据的正确传输和处理。

更多 DMA 相关内容, 请参考下面帖子:

更多内容请看下面文章:

现在很多芯片都集成DMA了,但是“DMA 事务可能导致逻辑错误”这一点还没有遇到过,直接读取内存不经过CPU,会产生丢数据的情况吗?

主要根源是 DMA 外设绕过 CPU cache,而 CPU 又可能提前/后来访问同一内存区域,从而导致 cache 与主存 (RAM) 之间不一致 (cache-coherency) —— CPU 看到的是旧数据 (stale),DMA 写入的数据被 cache 隐藏 / 覆盖 / 丢失。

下面是一些相关的应用笔记,供你参考:

直接访问DMA可以大大的缩短处理时间,减轻CPU负担,这是经过验证的

但是同时需合理分配 DMA 通道、缓冲区地址和传输模式,配置不当可能导致数据损坏或系统不稳定

DMA也需要关注cache一致性,以及总线竞争问题,这个在复杂SOC中比较容易忽略。

1 个赞

DMA也可以理解为MCU的一个协处理器。
对提升项目整体性能的作用,减少MCU打断有很好的帮助。
不过,因为其为异步处理,要注意数据的可重入问题。
我理解着主要还是时序与硬件资源的占用。

1 个赞

我还是喜欢用DMA的,在数据量大的通信中,直接将收发数据丢给DMA,不用去管收发的过程,完成后用中断通知MCU即可。节省了处理器的很大一部分开支。省心又省力,当然对应较为简单的应用,实时性要求不是那么高用不用都一样。