多通道 DMA 拓扑:仲裁、并发传输、虚拟通道与总线占用
更新时间:2026-09-19。前置:DMA 控制器微架构、DMA 描述符环、DMA 突发/对齐/cache。单个通道讲的是「一次怎么搬」,多通道 DMA 要解决「很多路同时搬时谁先、怎么不互相饿死、怎么占满/不霸占总线」。
本文要回答的问题
- 一个 DMA 控制器的多个通道共享什么、独占什么?
- 多个通道同时请求时如何仲裁,怎么保证带宽与延迟?
- 单 AXI 主口和多 AXI 主口拓扑有何取舍?
- 高带宽通道如何不饿死慢速实时外设?
一、通道里什么独占、什么共享
bash
通道0: 配置寄存器(源/目的/长度/突发)+描述符指针+FIFO+完成中断
通道1: 同上(独立) ┐
通道2: 同上(独立) ├─ 每通道独立上下文/状态
... ┘
│ 请求
┌───▼──────────────┐
│ 通道仲裁器 │ ── 共享:内部读/写数据通路、
│ (优先级/轮询/加权) │ AXI 主接口(一个或多个)、
└───┬──────────────┘ 时钟/复位
▼
读引擎(一个或多) → 内部 FIFO/缓冲 → 写引擎 → AXI 互连- 每通道独占:源/目的地址、传输长度、当前描述符指针、控制/状态、使能、完成/错误中断、可能还有小 FIFO。
- 共享:AXI 主端口、读/写数据通路与大缓冲、地址生成与流水线。通道是一组逻辑上下文,通过时分复用共享物理搬运引擎,类似于多线程。
二、通道仲裁
常见策略(与总线仲裁同源,见 round-robin 公平性):
- 固定优先级:实时音频/高速 UART 设高优先级。简单,但低优先级在持续高负载下可能饿死。
- 轮询 round-robin:通道轮流,公平、无饿死,但不区分紧迫度。
- 加权轮询 / 带宽配额(WRR):给高带宽通道更高权重(每轮多服务几次),同时保证低优先级也有保底份额,兼顾吞吐和公平。
- 突发粒度切换:仲裁不能在一个 AXI 突发中途乱切(会降低效率/破坏总线),通常以「一个突发」「一次传输配额(quantum)」或「FIFO 水位」为单位调度。
- 可在「请求仲裁(谁发起读)」和「写回仲裁」分别做,读预取和写回解耦。
三、单主口 vs 多主口拓扑
| 拓扑 | 特点 |
|---|---|
| 单 AXI 主口多通道 | 面积小;所有通道在一个口上时分复用;靠 AXI outstanding/ID 区分在途事务;总带宽受单口限制 |
| 多 AXI 主口 | 高带宽通道独占端口,可并行打到不同从机/存储体;面积大、ID/QoS 更复杂 |
| 读口/写口分离 | 利用全双工,读预取与写回并行(DMA 读-写两阶段,见 DMA 微架构) |
即使单主口,DMA 也能用不同 **AXI ID(虚拟通道/QoS)**让互连把多通道事务区分、重排,但要自己处理返回顺序(见 AXI ID 排序)。
四、FIFO 隔离与流控
通道间、读与写之间用 FIFO 解耦:
- 读得快、写得慢(如内存→慢速外设)时 FIFO 吸收差;FIFO 满则暂停读、水位下降再续,避免冲爆外设(见 valid/ready 反压)。
- 外设→内存(如 ADC 采样)要求确定性及时搬走,FIFO 水位/半空中断配合高优先级通道保证不溢出(见 ADC 过采样)。
- 每通道独立小 FFO 或共享大缓冲按通道分配;共享缓冲要做配额防一通道占满(和 NoC buffer 分配同理)。
五、总线占用、突发与实时
- 长突发效率高(见 突发对齐)但长时间占总线,会拖慢 CPU 取指和其他主设备;通过缩短突发、插入释放点、QoS、加权配额限制「连续占用预算」。
- 优先级反转:高优先级实时通道等总线,低优先级大块传输正持有唯一缓冲/主口。要在仲裁和缓冲资源两处都支持抢占/预留,不能只在一层做优先级。
- 完成/错误中断经中断聚合器分发,可绑核(见 事件路由、中断聚合)。
六、常见的坑
- 通道状态不独立:共享了地址/长度/描述符指针,多通道串扰、互踩内存。
- 固定优先级无保底:大块通道跑满时慢速实时通道饿死/溢出。
- 在突发中途切通道处理不当:撕裂突发、总线效率下降或返回错配。
- 单口多通道 ID 复用过早:AXI 响应乱序回来对不上通道(见 ID 排序)。
- 共享 FIFO 无配额:一个通道占满缓冲,其他通道停摆。
- 读预取过度:慢外设场景预取了用不上的数据占带宽/缓存。
- 只在一层仲裁:仲裁器有优先级但写引擎/缓冲内部无优先级,反转依旧。
- 长突发霸占总线:CPU/视频等对延迟敏感的主设备被饿死,要 QoS/配额。
- 描述符环竞争:多核/多通道用同一描述符内存却无锁/无独立环(见 描述符环、硬件自旋锁)。
- 中断全挤一线:多通道完成中断不区分,ISR 轮询全部通道寄存器,应每通道独立向量/聚合。
- 跨通道 cache 维护遗漏:源/目的内存一致性按通道分别维护(见 DMA 与 cache)。
- 复位只停一半通道:软复位某通道时其在途 AXI 事务未排空,导致总线挂死(见 总线超时)。
相关与延伸
单通道机制见 DMA 微架构、描述符环、突发与 cache;仲裁见 round-robin;多主互连见 AXI Crossbar、CHI。
总结
多通道 DMA 让每通道独占地址/长度/描述符指针/状态/中断(一份逻辑上下文)而共享读写作业引擎和一个或多个 AXI 主口,由通道仲裁器按固定优先级、轮询或加权轮询在「一个突发/一个配额」粒度上调度,单口用不同 AXI ID/QoS 区分在途事务、多口则可并行打到不同存储体;FIFO 按通道配水位和配额做反压隔离,并在仲裁与缓冲两层都防优先级反转、用带宽配额限制长突发霸占总线——通道上下文不独立、低优先级无保底、ID 复用错配和共享缓冲无配额是四大串扰/饿死根因。