DMA(直接内存访问)技术在现代计算系统中扮演着关键角色,它通过专用硬件控制器实现内存间的高效数据传输,彻底解放了CPU的计算资源。作为Arm CoreLink系列中的高性能DMA控制器,DMA-350在传统1D连续传输基础上,提供了更为强大的2D块传输能力,特别适合处理图像、矩阵等结构化数据。
DMA-350的2D传输引擎通过一组精确定义的寄存器参数控制数据传输行为:
地址参数:
SRCADDR/DESADDR:源/目标内存基地址SRCXADDRINC/DESXADDRINC:X方向地址增量步长SRCYADDRSTRIDE/DESYADDRSTRIDE:Y方向行间跨度(相邻行首地址偏移)尺寸参数:
SRCXSIZE/SRCYSIZE:源数据块X/Y方向元素数量DESXSIZE/DESYSIZE:目标区域X/Y方向元素容量传输模式:
XTYPE/YTYPE:定义X/Y方向的数据处理方式(CONTINUE/WRAP/FILL)1DTYPE/2DTYPE:传输维度选择标志这些参数共同构成了一个灵活的2D数据传输框架,使得简单的地址生成器能够实现复杂的数据重塑操作。例如在图像旋转场景中,通过调整DESXADDRINC和DESYADDRSTRIDE的值,可以实现在目标内存中按不同方向排列像素数据。
DMA-350支持通过参数组合实现多种几何变换,其核心原理是通过地址生成器的非线性寻址来重塑数据布局:
旋转操作(以8x8块为例):
DESXADDRINC = -原Y跨度,DESYADDRSTRIDE = 原元素大小DESXADDRINC = 原Y跨度,DESYADDRSTRIDE = -原元素大小镜像操作:
DESXADDRINC = -原元素大小,保持Y方向参数不变DESYADDRSTRIDE = -原行跨度实际配置示例(逆时针旋转90度):
c复制// 源图像参数(假设为RGB888格式,320x240分辨率)
SRCXSIZE = 320; // 每行320像素
SRCYSIZE = 240; // 共240行
SRCXADDRINC = 3; // 每个像素3字节(RGB)
SRCYADDRSTRIDE = 320*3; // 行跨度
// 目标配置(旋转后变为240x320)
DESXSIZE = 240; // 旋转后每行240像素
DESYSIZE = 320; // 共320行
DESXADDRINC = -960; // 负的源Y跨度(240行*4字节对齐)
DESYADDRSTRIDE = 3; // 旋转后Y步长等于原像素大小
关键细节:在旋转操作中,必须特别注意内存地址对齐问题。例如当源图像行长度不是缓存行大小的整数倍时,需要适当调整YADDRSTRIDE值以确保性能最优。
WRAP是DMA-350最具创新性的2D操作模式,它允许源数据和目标区域采用不同的尺寸和排列方式。这种能力使得简单的内存拷贝升级为强大的数据重塑工具,其核心特点包括:
WRAP操作的行为主要由XTYPE和YTYPE参数控制,这两个参数各有四种可能的取值:
将128x128的源图像放入256x256的目标缓冲区,边缘填充黑色:
c复制SRCXSIZE = 128; SRCYSIZE = 128;
DESXSIZE = 256; DESYSIZE = 256;
XTYPE = WRAP; // X方向循环使用源数据
YTYPE = FILL; // Y方向超出部分填充
FILL_VALUE = 0x00000000; // 黑色填充值
将行优先存储的矩阵转为列优先存储:
c复制SRCXSIZE = N; SRCYSIZE = M;
DESXSIZE = M; DESYSIZE = N;
DESXADDRINC = 原始行跨度;
DESYADDRSTRIDE = 原始元素大小;
XTYPE = CONTINUE;
YTYPE = CONTINUE;
为3x3卷积准备输入数据,使用WRAP模式自动扩展边界:
c复制SRCXSIZE = 输入宽度; SRCYSIZE = 输入高度;
DESXSIZE = 输入宽度+2; DESYSIZE = 输入高度+2; // 增加padding
XTYPE = FILL;
YTYPE = FILL;
FILL_VALUE = 0; // 零填充
DMA-350内部实现了一个精密的状态机来处理各种WRAP场景,主要考虑以下维度:
尺寸关系:
模式组合:
边界条件:
下表总结了关键WRAP模式的行为特征:
| 场景描述 | XTYPE | YTYPE | 典型应用 |
|---|---|---|---|
| 简单块拷贝 | CONTINUE | CONTINUE | 常规2D复制 |
| 水平平铺 | WRAP | CONTINUE | 纹理水平重复 |
| 垂直平铺 | CONTINUE | WRAP | 纹理垂直重复 |
| 二维平铺 | WRAP | WRAP | 全平面纹理贴图 |
| 边缘填充 | FILL | FILL | 图像边界扩展 |
| 水平镜像+垂直平铺 | WRAP | WRAP | 特殊效果生成 |
DMA-350的触发系统是一个高度灵活的硬件事件网络,主要组件包括:
触发输入支持多种工作模式,通过TRIGGER_MODE寄存器配置:
4相位握手协议是DMA-350触发机制的核心,其信号定义如下:
请求方信号:
req:触发请求有效req_type[1:0]:
响应方信号:
ack:触发确认ack_type[1:0]:
典型交互时序:
code复制外设: req=1, req_type=BLOCK
DMA: ack=1, ack_type=OKAY (开始传输)
外设: req=0
DMA: ack=0 (握手完成)
code复制外设: req=1, req_type=BLOCK
DMA: 执行BLOCK_SIZE指定的传输量
DMA: ack=1, ack_type=OKAY (传输完成)
外设: req=0
DMA: ack=0 (准备下次触发)
mermaid复制sequenceDiagram
传感器->>DMA: VSYNC触发(命令模式)
DMA->>内存: 开始帧传输
传感器->>DMA: 每行HSYNC触发(流控模式)
DMA->>内存: 按行写入
传感器->>DMA: 帧结束触发
DMA->>处理器: 传输完成中断
c复制// 配置双缓冲乒乓操作
void configure_audio_dma() {
// 缓冲区A配置
DMA.DESADDR = buf_a;
DMA.DESXSIZE = SAMPLES_PER_BLOCK;
DMA.XTYPE = CONTINUE;
// 触发配置
DMA.TRIGGER_MODE = FLOW_CONTROL;
DMA.BLOCK_SIZE = SAMPLES_PER_BLOCK/2; // 双缓冲
// 中断配置
DMA.INT_ENABLE = BLOCK_COMPLETE;
}
AI推理中典型的两级触发流水线:
地址对齐优化:
突发传输最大化:
预取策略选择:
常见问题1:传输性能低于预期
常见问题2:数据错位或损坏
调试技巧:
c复制// 启用DMA调试计数器
REGISTER(DMA_DEBUG_CTRL) = ENABLE_ALL_COUNTERS;
// 关键性能指标
uint32_t stall_cycles = REGISTER(DMA_RD_STALL_COUNT);
uint32_t data_beat = REGISTER(DMA_DATA_BEAT_COUNT);
float utilization = (float)data_beat/(data_beat+stall_cycles);
模式1:链式2D操作
通过链接多个DMA命令实现复杂变换:
模式2:动态参数更新
在传输过程中通过中断服务程序更新参数:
c复制void DMA_ISR() {
static int angle = 0;
angle = (angle + 90) % 360;
update_rotation_params(angle); // 动态更新旋转参数
DMA.INT_CLEAR = 1; // 清除中断
}
模式3:与GPU协同工作
mermaid复制flowchart TB
CPU -->|配置描述符| DMA
DMA -->|传输图像数据| GPU_内存
GPU -->|处理完成触发| DMA
DMA -->|回传结果| 系统内存
在实际项目中,我们曾使用DMA-350实现了一个高效的图像处理流水线,将1080p YUV转RGB的性能提升了3倍。关键点在于精心设计了2D参数,使得:
这种深度优化需要对DMA控制器的每个特性都有透彻理解,特别是2D操作中地址生成器的精确行为。建议开发者在实现复杂数据传输前,先用小数据块验证参数设置的正确性,再逐步扩展到实际应用场景。