存储技术
DMA,即动态内存访问,是一些微控制器的一项功能,数据可以独立于CPU移动,使CPU可以自由地做其他工作,从而增加了系统可以同时完成的工作总量。
DMA可以将数据从一个内存区域移动到另一个,从内存移动到外设,或者从外设移动到内存。
存储器到外设DMA
存储器到外设数据复制的一个例子是大量数据应该通过通信外设(例如UART)传输的情况;如果没有DMA,CPU将需要在传输数据时进行“阻塞”(通常传输速度相对较慢,取决于通信协议的速度),或者使用中断来管理传输(由于中断上下文切换,这会增加额外的处理开销)。
这个例子也只考虑了只有一个数据传输需要同时发生的情况——DMA通常可以同时处理多个数据流(取决于特定的微控制器实现)。
外设到存储器DMA
外设到内存的DMA是类似的——当CPU忙于做其他事情时,可以从通信外设(如UART)读取数据,并将其复制到内存缓冲区。除了让CPU自由地做其他工作之外,这还确保了通信数据不会因为CPU忙于另一个任务而不在准备处理接收数据的代码段中而丢失。
同样,当有多个设备可能同时通信时(想想5个或10个!);DMA可以用来缓冲它们的每个通信,完美地并且没有数据丢失的可能性,直到CPU运行准备好处理接收的数据的代码段。虽然有些微控制器在通信外设中包含一个小的接收缓冲器,但利用DMA,接收缓冲器可以任意大,只受可用RAM的限制。
外设到存储器DMA的另一个例子可以是通过ADC采样模拟信号。本例中设置了一个定时器,用于以设定的时间间隔触发一个或多个通道上的ADC采样。采样发生时,读数通过DMA自动传输到内存缓冲区。然后,单独的DMA流可以将这些缓冲区复制到另一个内存区域,供CPU运行DSP(数字信号处理)算法。最后,另一个DMA流可用于将处理后的信号传输至微控制器DAC进行输出(存储器至外设)。(如果您不熟悉这些术语,您可以在我们的中找到概述物理输出核心或者数(字)-模(拟)转换器博客文章)。这样,CPU就可以腾出时间来运行密集型DSP算法,而无需浪费任何时间来管理ADC、存储器复制或DAC。
对于接收数据,一些微控制器支持循环DMA缓冲区,而其他微控制器支持乒乓缓冲区,其中数据接收在两个存储器部分之间交替进行(本文作者更喜欢循环缓冲区,认为它们更有效,更容易编写代码)。
对于没有经验的程序员来说,DMA可能令人望而生畏,但是一旦你投入时间使用它一次,那么你就有了一个代码模板,它可以很容易地复制到其他项目,并且可以大大提高你的项目的质量和/或你的微控制器可以处理的项目的复杂性。
审核编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !