DMA-350是Arm CoreLink系列中的高性能DMA控制器IP核,采用多通道并行架构设计。每个物理通道可独立配置为8个虚拟通道,通过时分复用机制实现高吞吐量数据传输。控制器内部采用三级流水线结构:命令获取、地址生成和数据搬运,配合128-bit AXI总线接口,单周期可完成16字节数据传输。
在内存访问方面,DMA-350支持非对齐访问(通过TRANSIZE配置)、端序转换和位宽转换等特性。其地址生成单元包含X/Y两个维度的地址计算器,支持正向/负向步进(通过XADDRINC/YADDRSTRIDE配置),可实现复杂的内存访问模式。例如在图像旋转场景中,通过设置负向Y地址步长,可以实现垂直方向的反转操作。
每个DMA通道拥有独立的寄存器组,共包含40个32位寄存器,分为以下几类:
地址配置寄存器:
传输尺寸寄存器:
传输属性寄存器:
该寄存器控制源端传输的AXI总线属性:
c复制[19:16] SRCMAXBURSTLEN = 0xF(默认16拍突发)
[11] SRCPRIVATTR = 0(非特权访问)
[10] SRCNONSECATTR = 1(非安全访问)
[9:8] SRCSHAREATTR = 0x0(非共享)
[7:4] SRCMEMATTRHI = 0x0(设备内存)
[3:0] SRCMEMATTRLO = 0x0(Device-nGnRnE)
重要提示:当访问外设寄存器等设备内存时,必须配置为Device-nGnRnE属性,禁止使用缓存策略,否则会导致不可预知的行为。
实现地址自动更新的核心寄存器:
c复制[31:16] DESXADDRINC:目的端X增量(有符号)
[15:0] SRCXADDRINC:源端X增量(有符号)
地址更新公式:
code复制下一地址 = 当前地址 + (1 << TRANSIZE) * XADDRINC
典型应用场景:
自动重启功能配置:
c复制[16] CMDRESTARTINFEN:无限重启使能
[15:0] CMDRESTARTCNT:重启计数器
工作流程:
基础配置步骤:
示例:搬运8KB数据块
c复制CH_SRCADDR = 0x80000000;
CH_DESADDR = 0x90000000;
CH_XSIZE = 2048; // 8KB/4byte
CH_XADDRINC = 0x00010001; // 源和目的都+4
CH_TRANSIZE = 2; // 32-bit传输
视频帧搬运典型配置:
c复制CH_XSIZE = 1280; // 行宽1280像素
CH_YSIZE = 720; // 720行
CH_XADDRINC = 0x00040004; // 每个像素+4字节(ARGB)
CH_YADDRSTRIDE= 0x00001400;// 下一行偏移1280*4=0x1400
内存布局优化技巧:
实现步骤:
描述符结构示例:
c复制struct dma_desc {
uint32_t ctrl; // 控制字段
uint32_t src_addr;
uint32_t dest_addr;
uint32_t xsize_ysize;
uint32_t next_desc; // 链接地址
};
硬件触发输入配置(以源端为例):
c复制[11:10] SRCTRIGINMODE = 2'b10(DMA驱动流控)
[9:8] SRCTRIGINTYPE = 2'b10(硬件触发)
[7:0] SRCTRIGINSEL = 0x01(选择触发输入1)
实测建议:硬件触发延迟通常需要3-5个时钟周期,建议在触发信号后添加适当延迟再启动数据传输。
最优突发长度计算公式:
code复制实际突发长度 = min(
SRCMAXBURSTLEN + 1,
DATA_BUFF_SIZE / (1 << TRANSIZE)
)
典型优化策略:
根据内存类型配置SRCMEMATTR:
c复制// Write-back配置
SRCMEMATTRHI = 0x7; // Outer RW allocate
SRCMEMATTRLO = 0x7; // Inner RW allocate
c复制SRCMEMATTRHI = 0x0;
SRCMEMATTRLO = 0x0; // nGnRnE
多通道负载均衡方案:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 传输数据错位 | TRANSIZE配置错误 | 检查数据总线位宽匹配 |
| 突发传输被截断 | MAXBURSTLEN超过缓冲区大小 | 减小突发长度或增大DATA_BUFF_SIZE |
| 触发模式不工作 | 未设置CH_EXT_FEAT_EN | 检查通道扩展功能使能位 |
寄存器冻结技术:
数据对比方法:
c复制// 在目的地址前后设置魔数
uint32_t marker[] = {0xDEADBEEF, 0xCAFEBABE};
// 传输完成后检查魔数是否被破坏
性能分析手段:
典型配置流程:
c复制CH_XSIZE = image_width;
CH_YSIZE = image_height;
CH_XADDRINC = 0x00010003; // 源端+1(Y), 目的端+3(RGB)
c复制CH_YADDRSTRIDE = -4; // 垂直方向负增量
CH_XADDRINC = image_width*4; // 水平步进为图像跨度
c复制CH_LINKADDR = scale_desc_addr;
CH_AUTOCFG = 0x00010000; // 无限循环
DMA优化方案:
c复制// 描述符直接指向网络硬件缓冲区
CH_SRCADDR = HW_RX_BUF_ADDR;
// 配置为设备内存属性
CH_SRCTRANSCFG = 0x000F0400;
在长期使用DMA-350控制器的实践中,我发现合理配置内存属性和突发长度对性能影响最大。例如在处理视频流时,将帧缓冲区配置为Write-back模式并启用最大突发长度,可以使DMA吞吐量达到理论带宽的95%以上。另外需要注意,当使用命令链接功能时,务必确保描述符所在内存区域的缓存一致性,否则可能导致不可预知的命令加载错误。