3. DMA控制器硬件架构:通道、请求线、仲裁机制、传输粒度(burst size)
DMA控制器是嵌入式系统中实现高速数据搬运的核心硬件单元。要编写高效的DMA驱动,必须深入理解其内部架构:通道(Channel)如何独立管理传输任务、请求线(Request Line)如何连接外设与控制器、仲裁机制(Arbitration)如何解决多通道竞争、以及传输粒度(Burst Size)如何决定单次总线事务的数据量。本节将逐一拆解这些关键模块。
3.1 DMA通道:独立传输引擎
每个DMA通道本质上是一个独立的硬件状态机,包含一组寄存器(源地址、目的地址、传输计数、控制配置)和有限状态机逻辑。多通道设计允许DMA控制器同时处理多个外设的数据搬运请求,而无需CPU介入。
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通道在硬件层面维护一个简单的状态机,驱动通过配置寄存器触发状态迁移:
- 空闲(Idle):通道未配置或传输完成,等待软件使能。
- 等待请求(WaitReq):通道已使能,等待外设或软件触发DMA请求。
- 传输中(Transferring):正在执行总线读写,每次burst后更新地址和计数。
- 完成(Complete):传输计数归零,触发中断(若使能),自动回到空闲。
- 错误(Error):总线错误或配置异常,需软件复位。
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传输完成后即可切换通道。延迟低,适合多外设并发场景。
3.4 传输粒度(Burst Size)
Burst Size(也称为突发长度)是DMA在一次总线事务中连续传输的数据单元数量。它是影响总线利用率和传输效率的关键参数。
3.4.1 Burst Size的定义
Burst Size通常以“拍数”(beats)表示,每拍传输的数据宽度由数据总线宽度决定(如32位总线每拍4字节)。常见的burst size配置有:1、4、8、16拍。
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会长时间占用总线,影响其他实时任务。
3.5 驱动开发中的硬件配置要点
在编写DMA驱动时,以下硬件配置项需要特别关注:
- 通道分配策略:为不同优先级的外设分配固定通道,或使用动态通道池。
- 请求线映射:根据硬件设计文档配置请求线路由寄存器。
- 仲裁优先级设置:显示刷新通道通常设为最高优先级,避免画面撕裂。
- Burst Size优化:根据外设FIFO深度和系统延迟预算选择最优burst size。
- 地址对齐检查:在启动DMA前验证源/目的地址是否满足burst对齐要求。