Proteus:什么是动态内存访问
来源: | 作者:风标电子工程师 | 发布时间: 2026-01-30 | 20 次浏览 | 分享到:

在嵌入式开发中,你是否遇到过这样的困境:CPU忙着处理核心任务,却还要分心跑腿传输数据,导致整体效率大打折扣?今天,我们就来聊聊解决这个问题的关键技术——DMA(动态内存访问),一个能让CPU“解放双手的高效数据搬运工

一、什么是DMA?核心价值是什么?

DMA,全称Dynamic Memory Access(动态内存访问),是多数微控制器具备的核心功能。其核心价值在于:无需CPU介入,即可自主完成数据在不同存储区域或外设与内存之间的传输

这就好比工厂里的流水线,CPU是核心操作工,负责处理复杂的加工任务;而DMA是专门的物料搬运工,负责将原材料(数据)从仓库(内存)运到生产线(外设),或把成品(处理后的数据)运回仓库,让CPU无需停下手中的核心工作,从而大幅提升系统的整体吞吐量和并行处理能力。

DMA的传输场景主要包括三类:

• 内存内存:数据在两个内存区域间直接复制;

• 内存外设:数据从内存传输到外设(如UARTDAC等);

• 外设内存:数据从外设(如UARTADC等)读取到内存。

二、内存外设DMA:告别传输阻塞与中断开销

我们先看一个常见场景:通过UART等通信外设传输大量数据。在没有DMA的情况下,CPU只有两种处理方式,且都存在明显弊端:

1. 阻塞式传输CPU必须全程盯着数据传输过程,直到所有数据发送完成才能做其他事。而通信协议的速度往往远低于CPU运行速度,这就导致CPU大量时间被浪费,相当于操作工放下手里的活,全程盯着物料搬运

2. 中断式传输CPU可以先处理其他任务,数据传输完成后通过中断通知CPU。但这种方式需要频繁进行中断上下文切换,每次切换都会产生额外的处理开销,就像操作工刚专心加工一会儿,就被搬运工打断确认物料,频繁分心降低效率

DMA的出现完美解决了这些问题:CPU只需提前告诉DMA“要传输的数据地址、目标外设、传输长度,之后就可以全身心投入核心任务;DMA会自主完成数据传输,完成后再通过中断(可选)告知CPU即可。

更重要的是,DMA并非只能处理单一数据流——多数微控制器的DMA控制器支持同时管理多个独立的数据流(具体数量取决于芯片型号),比如同时通过UART发送数据、通过SPI传输数据,互不干扰,进一步提升系统并行处理能力。

三、外设内存DMA:数据不丢失,多设备通信更从容

外设内存的DMA传输,核心优势在于确保数据不丢失、减轻CPU接收压力,尤其适合多设备并发通信或高频数据采集场景。

比如多设备通信场景:当有5个、10个外设同时通过UART发送数据时,CPU如果逐个处理接收,很可能因为忙于其他任务而错过数据(导致数据丢失)。而DMA可以在CPU处理核心任务时,自主将各个外设的接收数据搬运到内存缓冲区,相当于搬运工主动接收各个供应商的物料,存入仓库,等操作工空闲时再统一处理,完美避免数据丢失问题。

可能有同学会说:外设本身不是有接收缓冲区吗?确实,部分通信外设内置了小型接收缓冲区,但容量有限(通常几个字节到几十个字节),面对高频或大量数据时很容易溢出;而DMA使用的内存缓冲区,容量仅受限于微控制器的可用RAM,可根据需求灵活设置,适配各种大数据量场景。

典型案例:ADC采样+DSP处理+DAC输出的全流程DMA应用

外设内存DMA的一个经典应用,是模拟信号采集与处理全流程,我们通过一个完整场景理解其价值:

假设需要对模拟信号进行采样、数字信号处理(DSP),并将处理后的信号通过DAC输出。传统方案中,CPU需要负责触发ADC采样、读取采样值、将数据传输到处理缓冲区、运行DSP算法、再将处理后的数据发送到DAC——全程被繁琐的数据搬运工作占用,根本无法高效运行高强度的DSP算法。

而通过DMA实现的方案,流程完全自动化:

1. 定时器按固定间隔触发ADC采样;

2. ADC采样完成后,DMA自动将采样值搬运到内存缓冲区(外设内存);

3. 另一路DMA将采样缓冲区的数据复制到DSP处理缓冲区(内存内存);

4. CPU专注运行DSP算法,无需参与任何数据搬运;

5. 算法处理完成后,第三路DMA将结果搬运到DAC输出(内存外设)。

整个过程中,CPU只需专注于核心的DSP算法,数据传输全由DMA自主完成,系统效率大幅提升。(如果对ADCDAC等术语不熟悉,可以参考我们之前的专属科普文章~

补充:两种常用的接收缓冲区模式

在数据接收场景中,为了更高效地管理缓冲区,微控制器通常支持两种DMA缓冲区模式:

• 圆形DMA缓冲区:缓冲区地址首尾相连,数据写满后自动从起始地址覆盖,CPU按需读取数据,无需频繁切换缓冲区,效率更高,编码也更简洁(作者更推荐这种模式);

• 乒乓缓冲区:设置两个独立的内存区间,DMA交替向两个缓冲区写入数据,CPU则交替读取两个缓冲区的数据,避免读取与写入冲突,适合对实时性要求极高的场景。

四、总结:DMA没那么难,上手即解锁高效开发

对于嵌入式新手来说,DMA的配置和使用可能初看有些复杂,甚至让人望而生畏。但实际上,只要花时间动手实践一次,掌握其核心配置逻辑(传输源、传输目标、传输长度、触发方式等),就能形成可复用的代码模板——后续项目中只需稍作修改,就能快速适配不同的传输场景。

学会使用DMA,不仅能大幅提升项目的运行效率,还能让微控制器从容应对更复杂的多任务、大数据量场景(比如多外设并发通信、高频数据采集与处理等),是嵌入式开发进阶路上的必备技能。

下次开发项目时,不妨试试用DMA解放CPU,感受一下高效开发的快乐~