3. DMA控制器硬件架构:通道、请求线、仲裁机制、传输粒度(burst size)

DMA控制器是嵌入式系统中实现高速数据搬运的核心硬件单元。要编写高效的DMA驱动,必须深入理解其内部架构:通道(Channel)如何独立管理传输任务、请求线(Request Line)如何连接外设与控制器、仲裁机制(Arbitration)如何解决多通道竞争、以及传输粒度(Burst Size)如何决定单次总线事务的数据量。本节将逐一拆解这些关键模块。

3.1 DMA通道:独立传输引擎

每个DMA通道本质上是一个独立的硬件状态机,包含一组寄存器(源地址、目的地址、传输计数、控制配置)和有限状态机逻辑。多通道设计允许DMA控制器同时处理多个外设的数据搬运请求,而无需CPU介入。

关键概念: 通道是DMA调度的最小资源单位。驱动开发中,通道分配与释放是资源管理的核心操作。

3.1.1 通道内部寄存器组

寄存器名称 位宽 功能描述
SAR (Source Address Register) 32/64位 源数据地址,支持递增、递减或固定模式
DAR (Destination Address Register) 32/64位 目的数据地址,支持递增、递减或固定模式
CTL (Control Register) 32位 传输方向、数据宽度、burst size、中断使能等
CNT (Transfer Count Register) 16/32位 剩余传输字节数或传输次数
CSR (Channel Status Register) 32位 通道状态(空闲、运行、完成、错误)

3.1.2 通道状态机

DMA通道在硬件层面维护一个简单的状态机,驱动通过配置寄存器触发状态迁移:

  1. 空闲(Idle):通道未配置或传输完成,等待软件使能。
  2. 等待请求(WaitReq):通道已使能,等待外设或软件触发DMA请求。
  3. 传输中(Transferring):正在执行总线读写,每次burst后更新地址和计数。
  4. 完成(Complete):传输计数归零,触发中断(若使能),自动回到空闲。
  5. 错误(Error):总线错误或配置异常,需软件复位。
DMA通道状态机 空闲 等待请求 传输中 完成 错误 软件使能 DMA请求到达 计数归零 总线错误 自动复位 软件复位

3.2 请求线:外设与DMA的桥梁

请求线(DMA Request Line)是外设向DMA控制器发起数据传输请求的硬件信号线。每个支持DMA的外设(如UART、SPI、I2S、ADC)通常占用一条或多条请求线,连接到DMA控制器的请求输入端口。

3.2.1 请求线类型

类型 触发方式 典型应用
硬件请求线 外设硬件信号边沿/电平触发 UART RX/TX、SPI FIFO半满、定时器溢出
软件触发请求 CPU写寄存器触发 内存到内存拷贝、软件模拟外设
链式请求 前一个DMA传输完成触发下一个 描述符链表、连续缓冲传输

3.2.2 请求线与通道的映射

现代DMA控制器通常提供可编程的请求线映射矩阵(Request Mapping Matrix),驱动可以灵活地将任意外设请求线连接到任意DMA通道。这种设计提高了硬件资源利用率,但也增加了驱动配置的复杂度。

驱动提示: 在设备树或平台数据中,通常使用 dma-requests 和 dma-channels 属性描述请求线与通道的映射关系。初始化时,驱动需要解析这些映射并配置DMA控制器的路由寄存器。

3.3 仲裁机制:多通道竞争管理

当多个DMA通道同时请求总线访问时,仲裁器(Arbiter)决定哪个通道获得总线控制权。仲裁策略直接影响系统的实时性和吞吐量。

3.3.1 常见仲裁策略

策略 原理 优点 缺点
固定优先级 通道编号越小优先级越高 实现简单,延迟可预测 低优先级通道可能饿死
轮询(Round-Robin) 各通道轮流获得总线 公平性好,无饿死 高优先级任务延迟不可控
混合优先级 高优先级固定,同优先级轮询 兼顾实时性与公平性 配置复杂
带宽分配 按比例分配总线时间片 适合多媒体流传输 硬件开销大

3.3.2 仲裁粒度

仲裁可以在两个层级进行:

  • 传输级仲裁:一个通道完成整个DMA传输后,才切换下一个通道。适合大数据块传输,但延迟高。
  • Burst级仲裁:每个burst传输完成后即可切换通道。延迟低,适合多外设并发场景。
DMA仲裁机制:Burst级轮询示例 通道0 通道1 通道2 仲裁器 轮询调度 系统总线 Burst级仲裁:每个burst后重新仲裁 通道0 burst → 通道1 burst → 通道2 burst → 循环

3.4 传输粒度(Burst Size)

Burst Size(也称为突发长度)是DMA在一次总线事务中连续传输的数据单元数量。它是影响总线利用率和传输效率的关键参数。

3.4.1 Burst Size的定义

Burst Size通常以“拍数”(beats)表示,每拍传输的数据宽度由数据总线宽度决定(如32位总线每拍4字节)。常见的burst size配置有:1、4、8、16拍。

性能公式: 总线利用率 = (有效数据传输时间) / (有效数据传输时间 + 总线仲裁开销 + 地址建立时间)。Burst size越大,分摊的固定开销越少,利用率越高。

3.4.2 Burst Size对性能的影响

Burst Size 总线利用率 延迟影响 适用场景
1(单次传输) 低(~30%) 低延迟,高响应 实时性要求高的外设(如音频I2S)
4 中(~60%) 中等 通用外设(UART、SPI)
8 高(~80%) 较高 显示缓冲、网络数据包
16 极高(~90%) 高延迟,可能阻塞其他设备 大块内存拷贝、存储设备

3.4.3 Burst Size与系统约束

选择burst size时需要考虑以下硬件约束:

  • 总线宽度:32位总线单拍4字节,64位总线单拍8字节。
  • 外设FIFO深度:burst size不应超过外设FIFO容量,否则可能溢出。
  • 内存对齐:源地址和目的地址必须对齐到burst size的整数倍,否则硬件可能自动降级为单次传输。
  • 系统延迟预算:大burst会长时间占用总线,影响其他实时任务。
Burst Size对总线事务的影响对比 Burst=1(单次传输) 数据 开销 数据 开销 数据 Burst=4(突发传输) D D D D 开销 D D D D 开销 Burst Size越大,固定开销占比越低 Burst=1:每传输1个数据单元都需要1次地址建立和仲裁 Burst=4:每传输4个数据单元只需1次地址建立和仲裁 但大Burst会延长总线占用时间,增加其他设备的等待延迟

3.5 驱动开发中的硬件配置要点

在编写DMA驱动时,以下硬件配置项需要特别关注:

  1. 通道分配策略:为不同优先级的外设分配固定通道,或使用动态通道池。
  2. 请求线映射:根据硬件设计文档配置请求线路由寄存器。
  3. 仲裁优先级设置:显示刷新通道通常设为最高优先级,避免画面撕裂。
  4. Burst Size优化:根据外设FIFO深度和系统延迟预算选择最优burst size。
  5. 地址对齐检查:在启动DMA前验证源/目的地址是否满足burst对齐要求。
常见陷阱: 某些DMA控制器在地址未对齐时会静默降级为单次传输模式,导致实际带宽远低于预期。驱动应在初始化时打印当前burst size配置,便于调试。

3.6 本章小结