Proteus 让您轻松编写和测试DMA固件!
来源:labcenter.com | 作者:labcenter | 发布时间: 2024-02-22 | 142 次浏览 | 分享到:

简介

DMA或动态内存访问是某些微控制器上的一项功能,数据可以独立于CPU移动,使CPU可以自由地执行其他工作,从而增加系统可以同时执行的总工作量。

DMA 可以将数据从一个内存区域移动到另一个内存区域,从内存移动到外设,或者从外设移动到内存。

内存到外设 DMA

内存到外设数据复制的一个例子是通过通信外设(如 UART)传输大量数据;如果没有 DMA,CPU 要么需要在传输数据时 "阻塞"(通常传输速度相对较慢,这取决于通信协议的速度),要么需要使用中断来管理传输(由于中断环境,这将增加额外的处理开销)。

本示例只考虑了只有一个数据传输需要同时进行的情况,DMA 通常可以同时处理多个数据流(取决于特定的微控制器实现)。

外设到内存DMA

外设到内存DMA类似 - 可以从通信外设(如UART)读取数据,并在CPU忙于执行其他操作时复制到内存缓冲区中。除了让 CPU 自由地做其他工作外,这还可以确保通信数据不会丢失,因为 CPU 忙于另一个任务,而不是在准备处理接收数据的代码段中。

同样,当有多个设备同时通信时(5 个或 10 个设备!),这一点尤其有用;DMA 可用于缓冲每个设备的通信,完美且不会丢失数据,直到 CPU 运行的代码段准备好处理接收到的数据。有些微控制器在通信外设中包含一个小的接收缓冲区,而使用 DMA 时,接收缓冲区可以任意增大,仅受可用 RAM 的限制。

外设到内存 DMA 的另一个例子是通过 ADC 对模拟信号进行采样。在这个例子中,设置了一个定时器,以设定的时间间隔触发一个或多个通道的 ADC 采样。采样发生时,读数会通过 DMA 自动传输到内存缓冲区。然后,一个单独的 DMA 流会将这些缓冲区复制到另一个内存区域,供 CPU 运行 DSP(数字信号处理)算法。最后,另一个 DMA 流可用于将处理后的信号传输到微控制器 DAC 进行输出(内存到外设)。(如果您不熟悉这些术语,可以在我们的 ADC 或 DAC 博客文章中找到相关概述)。这样,CPU 就可以将全部时间用于运行密集型 DSP 算法,而无需浪费时间管理 ADC、内存复制或 DAC。

对于接收数据,一些微控制器支持循环 DMA 缓冲区,而另一些微控制器则支持ping-pong缓冲区,即在两段内存之间交替接收数据(本文作者更倾向于循环缓冲区,认为其效率更高,更容易编写代码)。

小结

对于没有经验的编码员来说,DMA 可能看起来令人生畏,但一旦您投入时间使用过一次,就拥有了一个代码模板,可以很容易地复制到其他项目中,而且可以大大提高项目的质量和微控制器所能处理的项目的复杂性。

Proteus VSM CPU 模型可模拟真实设备中的 DMA 操作。这样,您就可以直接在运行的仿真中编写和测试 DMA 固件。了解有关 Proteus VSM MCU 仿真的更多信息请访问:https://www.labcenter.com/

本文章版权归英国Labcenter公司所有,由广州风标电子提供翻译,原文链接如下:https://www.labcenter.com/blog/sim-dma/