2. DMA基础概念
在嵌入式与SoC系统中,CPU的核心价值在于运算与决策,而不是充当数据搬运工。当外设需要与内存之间频繁交换大量数据时,如果每一次传输都由CPU亲自执行,系统性能会被严重拖累。DMA(Direct Memory Access,直接内存访问)正是为解决这一矛盾而生的机制:它允许外设在DMA控制器的协助下,直接与内存进行数据读写,而CPU只需在传输开始前配置参数、在传输结束后处理结果。
2.1 DMA的核心原理
DMA的本质是“总线主设备”的转移。在传统PIO模式下,CPU是唯一的总线主设备,所有数据搬运都要经过CPU的寄存器;而在DMA模式下,DMA控制器(DMAC)成为独立的总线主设备,它可以主动发起读写事务,直接访问源地址和目标地址。
一次典型的DMA传输包含四个阶段:
- 配置阶段:CPU通过寄存器接口写入源地址、目标地址、传输长度、数据宽度、传输模式等参数。
- 请求阶段:外设通过DMA请求线(如UART的RX Ready、ADC的转换完成)向DMAC发出传输请求。
- 搬运阶段:DMAC获得总线授权后,从源地址读取数据并写入目标地址,每次搬运可配置为单次、突发或整块传输。
- 完成阶段:传输计数归零后,DMAC置位完成标志并产生中断,通知CPU进行后续处理。
2.2 DMA与CPU中断、PIO的对比
理解DMA的价值,最有效的方式是与PIO(Programmed I/O)和中断驱动I/O进行对比。三者的核心差异在于“谁在执行数据搬运”以及“CPU介入的频率”。
| 对比维度 | PIO(程序控制I/O) | 中断驱动I/O | DMA |
|---|---|---|---|
| 数据搬运者 | CPU | CPU(中断服务程序中) | DMAC |
| CPU介入频率 | 每个字节/字 | 每次中断 | 每次传输块 |
| CPU开销 | 极高 | 中等 | 极低 |
| 适用数据量 | 小数据、低速 | 中等数据、事件驱动 | 大数据、高速流 |
| 典型场景 | GPIO翻转、调试串口 | 按键、传感器事件 | 音频流、图像采集、网络包 |
| 总线占用 | CPU全程占用 | CPU间歇占用 | DMAC占用,CPU可并行运算 |
从表中可以看出,DMA的核心优势不是“更快”,而是“解放CPU”。在高速数据流场景中,CPU如果被绑定在搬运工作上,就无法同时执行算法、协议栈或控制逻辑。DMA让CPU从搬运工变成指挥官。
2.3 典型应用场景
DMA在嵌入式系统中几乎无处不在,以下是几个最具代表性的场景:
- 高速ADC连续采样:ADC以固定采样率持续输出数据,DMA将每次转换结果自动写入内存缓冲区,CPU只需在缓冲区半满或全满时处理数据。
- UART大数据收发:在115200bps甚至更高速率下,逐字节中断会消耗大量CPU周期;DMA可以按块接收,显著降低中断频率。
- 音频播放与录音:I2S接口需要持续、稳定的数据流,DMA通过双缓冲机制保证音频不中断。
- 图像传感器数据搬运:摄像头输出的一帧图像可达数百KB到数MB,DMA将像素数据直接写入帧缓冲区,CPU只负责图像处理。
- 网络数据包收发:以太网MAC通过DMA将接收到的数据包写入内存,CPU处理协议栈而非搬运字节。
2.4 性能指标与配置参数
评估一个DMA控制器的性能,不能只看“能不能搬”,还要看“搬得多快、多稳、多省”。以下是关键性能指标:
典型DMA配置参数示例:
- 源地址:0x2000_0000(ADC数据寄存器)
- 目标地址:0x2000_1000(内存缓冲区)
- 传输长度:1024 字节
- 数据宽度:16 位(半字)
- 传输模式:循环模式(Circular)
- 优先级:高
- 中断使能:半传输中断 + 传输完成中断
- 突发长度:4 拍
性能指标:
- 吞吐量:单位时间内搬运的字节数(MB/s)
- 总线占用率:DMAC占用总线的时间比例
- 传输延迟:从请求到数据落地的响应时间
- CPU占用率:CPU用于DMA配置和中断处理的时间占比
- 通道数:支持并发传输的独立通道数量
其中,吞吐量和总线占用率是一对需要权衡的指标。DMAC如果长时间占用总线,会阻塞CPU取指和访存,导致系统实时性下降。因此,现代DMAC通常支持突发传输、总线仲裁优先级和通道优先级,以在吞吐量和公平性之间取得平衡。
2.5 常见误区与复盘
复盘来看,DMA的设计本质是在“通用性”和“效率”之间做取舍。CPU是通用处理器,适合复杂逻辑;DMAC是专用搬运引擎,适合规则、重复、高吞吐的数据移动。理解这一点,才能在RTL微架构设计中合理划分CPU与DMAC的职责边界,为后续可配置DMA控制器的通道管理、描述符解析和总线接口设计打下基础。