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引擎内部采用流水线设计——地址生成、总线请求、数据传输、计数器更新可并行执行,从而在连续传输中实现接近总线带宽的吞吐率。
2.2 通道(Channel)与请求(Request)机制
DMA通道是独立的数据传输路径,每个通道包含一组专用的寄存器(源地址、目的地址、传输长度、控制配置)。多通道设计允许DMA控制器同时管理多个独立的数据流。
2.2.1 通道类型
| 通道类型 | 触发方式 | 典型用途 | 优先级 |
|---|---|---|---|
| 硬件触发通道 | 外设硬件请求信号(DMA_REQ) | UART RX/TX、SPI、I2S、ADC | 可配置(通常高) |
| 软件触发通道 | CPU写触发寄存器 | 内存到内存拷贝、数据搬移 | 可配置(通常低) |
| 链式通道 | 前一个描述符完成后自动触发 | 批量描述符链表传输 | 继承当前描述符 |
2.2.2 请求握手流程
外设通过DMA请求线向DMA控制器发起传输请求,典型握手流程如下:
- 外设置位DMA_REQ:外设FIFO达到可发送/接收阈值时,拉高请求信号。
- DMA仲裁:通道仲裁器根据优先级选择待服务的通道。
- DMA置位DMA_ACK:DMA控制器拉高应答信号,表示接受请求。
- 外设清除DMA_REQ:外设检测到ACK后,释放请求信号。
- DMA传输:DMA执行一次突发传输(burst transfer),从外设FIFO读取数据写入内存,或反向操作。
- 传输完成:若传输计数器归零,触发完成中断;否则等待下一次请求。
性能提示: 硬件触发通道的请求延迟直接影响外设吞吐率。驱动应合理配置外设FIFO阈值和DMA突发长度,避免FIFO上溢/下溢。
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%。
2.4 关键性能参数
| 参数 | 说明 | 对性能的影响 |
|---|---|---|
| 通道数 | DMA支持的独立传输通道数量 | 通道数越多,并发数据流能力越强 |
| 最大突发长度 | 单次总线仲裁后连续传输的数据单元数 | 突发越长,总线利用率越高 |
| 地址对齐要求 | 传输宽度对应的地址对齐约束 | 非对齐访问导致性能下降或错误 |
| 描述符深度 | 链式描述符队列的最大长度 | 深度越大,CPU干预越少 |
| 请求响应延迟 | 从DMA_REQ到DMA_ACK的时钟周期数 | 延迟越短,外设FIFO压力越小 |
驱动开发要点: 在初始化DMA控制器时,务必检查硬件手册中关于地址对齐、突发长度上限和通道优先级的约束。错误的配置可能导致数据传输错位、总线死锁或性能远低于预期。