2. DMA控制器硬件架构

DMA(Direct Memory Access)控制器是系统总线上独立于CPU的专用数据搬运引擎。理解其内部结构、通道与请求机制、地址发生器与传输宽度,是编写高性能DMA驱动的理论基础。本节从硬件微架构出发,逐层拆解DMA控制器的核心组件。

2.1 DMA引擎内部结构

一个典型的DMA控制器内部由以下功能单元构成:

  • 控制逻辑单元(Control Logic):解析驱动下发的描述符,控制整个传输流程,包括启动、暂停、中止和错误处理。
  • 通道仲裁器(Channel Arbiter):当多个DMA通道同时请求总线时,按优先级策略(固定优先级或轮转)裁决总线使用权。
  • 地址发生器(Address Generator):根据源地址、目的地址、传输宽度和地址增量模式,自动生成每次突发传输的地址。
  • 传输计数器(Transfer Counter):记录剩余待传输的数据量,当计数器归零时触发传输完成中断。
  • 总线主控接口(Bus Master Interface):负责向系统总线(AHB/AXI/PCIe等)发起读/写事务,处理总线握手协议。
  • 寄存器组(Register File):包含控制寄存器、状态寄存器、地址寄存器、长度寄存器等,供CPU通过APB/AHB-Lite从接口访问。
架构要点: DMA引擎内部采用流水线设计——地址生成、总线请求、数据传输、计数器更新可并行执行,从而在连续传输中实现接近总线带宽的吞吐率。
DMA引擎内部结构框图 DMA引擎内部结构框图 控制逻辑单元 通道仲裁器 地址发生器 传输计数器 总线主控接口 寄存器组 说明:控制逻辑协调各单元工作;地址发生器与计数器并行运行,提升传输效率。

2.2 通道(Channel)与请求(Request)机制

DMA通道是独立的数据传输路径,每个通道包含一组专用的寄存器(源地址、目的地址、传输长度、控制配置)。多通道设计允许DMA控制器同时管理多个独立的数据流。

2.2.1 通道类型

通道类型 触发方式 典型用途 优先级
硬件触发通道 外设硬件请求信号(DMA_REQ) UART RX/TX、SPI、I2S、ADC 可配置(通常高)
软件触发通道 CPU写触发寄存器 内存到内存拷贝、数据搬移 可配置(通常低)
链式通道 前一个描述符完成后自动触发 批量描述符链表传输 继承当前描述符

2.2.2 请求握手流程

外设通过DMA请求线向DMA控制器发起传输请求,典型握手流程如下:

  1. 外设置位DMA_REQ:外设FIFO达到可发送/接收阈值时,拉高请求信号。
  2. DMA仲裁:通道仲裁器根据优先级选择待服务的通道。
  3. DMA置位DMA_ACK:DMA控制器拉高应答信号,表示接受请求。
  4. 外设清除DMA_REQ:外设检测到ACK后,释放请求信号。
  5. DMA传输:DMA执行一次突发传输(burst transfer),从外设FIFO读取数据写入内存,或反向操作。
  6. 传输完成:若传输计数器归零,触发完成中断;否则等待下一次请求。
性能提示: 硬件触发通道的请求延迟直接影响外设吞吐率。驱动应合理配置外设FIFO阈值和DMA突发长度,避免FIFO上溢/下溢。
DMA请求握手时序图 DMA请求握手流程 外设 (Peripheral) DMA控制器 内存 (Memory) ① DMA_REQ ② DMA_ACK ③ 数据总线传输 握手时序说明 外设发起DMA_REQ → DMA仲裁后回复DMA_ACK → 外设释放请求 → DMA执行总线传输 整个握手过程通常在几个总线时钟周期内完成,驱动无需干预。

2.3 地址发生器与传输宽度

地址发生器是DMA引擎中决定数据从哪里来、到哪里去的核心部件。它根据配置的地址增量模式和传输宽度,自动计算每次突发访问的地址。

2.3.1 地址增量模式

模式 地址变化 典型场景
固定地址(Fixed) 地址不变 外设数据寄存器(FIFO)
递增地址(Increment) 地址 += 传输宽度 内存缓冲区、数组
递减地址(Decrement) 地址 -= 传输宽度 栈操作、逆向拷贝
循环地址(Circular) 地址到达边界后回绕 音频环形缓冲区、双缓冲

2.3.2 传输宽度(Transfer Width)

传输宽度指DMA每次总线访问操作的数据位宽,常见配置包括:

  • 8位(Byte):用于字符设备、低速外设。
  • 16位(Half-word):用于音频采样、16位外设。
  • 32位(Word):最常用宽度,匹配32位总线。
  • 64位/128位(Double-word / Quad-word):用于高性能系统,需总线宽度匹配。
对齐约束: 源地址、目的地址和传输长度必须与传输宽度对齐。例如,32位传输要求地址按4字节对齐,长度是4的倍数。非对齐访问会导致总线错误或性能骤降。

2.3.3 突发传输(Burst Transfer)

地址发生器支持突发模式,在一次总线仲裁后连续传输多个数据单元,减少总线抢占开销:

  • 突发长度(Burst Length):1、4、8、16等,取决于总线协议。
  • 突发类型:固定突发(地址连续)和增量突发(地址按步长递增)。
  • 性能收益:突发传输可减少地址相位开销,提升总线利用率30%~50%。
地址发生器与传输宽度示意图 地址发生器与传输宽度 源地址发生器 src_addr += width 目的地址发生器 dst_addr += width 传输宽度配置 8/16/32/64 bit 地址增量模式 固定 (Fixed) 递增 (Increment) 递减 (Decrement) 循环 (Circular) 地址发生器根据传输宽度和增量模式,自动生成每次总线访问的物理地址。 驱动配置时需确保源/目的地址对齐到传输宽度,否则硬件可能触发异常。

2.4 关键性能参数

参数 说明 对性能的影响
通道数 DMA支持的独立传输通道数量 通道数越多,并发数据流能力越强
最大突发长度 单次总线仲裁后连续传输的数据单元数 突发越长,总线利用率越高
地址对齐要求 传输宽度对应的地址对齐约束 非对齐访问导致性能下降或错误
描述符深度 链式描述符队列的最大长度 深度越大,CPU干预越少
请求响应延迟 从DMA_REQ到DMA_ACK的时钟周期数 延迟越短,外设FIFO压力越小
驱动开发要点: 在初始化DMA控制器时,务必检查硬件手册中关于地址对齐、突发长度上限和通道优先级的约束。错误的配置可能导致数据传输错位、总线死锁或性能远低于预期。