sdk例程:zynq ps_dmac的使用与测速 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

硬件设计

  • 勾选DMAC,2个通道。
  • 增加一个bram_ctrl,容量64kB image

使用sdk自带的demo例程。

  • 为了测速,关键部分修改如下
// static int Src[DMA_LENGTH] __attribute__ ((aligned (32)));
// static int Dst[DMA_LENGTH] __attribute__ ((aligned (32)));
int *Src=(int *)0x10000000;
int *Dst=(int *)0x10008000;

.....
.....

XTime t1,t2;
XTime_GetTime(&t1);
Status = XDmaPs_Start(DmaInst, Channel, &DmaCmd, 0);
if (Status != XST_SUCCESS) {
	return XST_FAILURE;
}
XTime_GetTime(&t2);
int dt = (u32)(t2-t1) * (1000000.0/ COUNTS_PER_SECOND);
xil_printf("dt=%dus\r\n", dt);

XTime_GetTime(&t1);
for (Index = 0; Index < DMA_LENGTH; Index++) {
	Dst[Index] = Src[Index];
}
XTime_GetTime(&t2);
dt = (u32)(t2-t1) * (1000000.0/ COUNTS_PER_SECOND);
xil_printf("dt=%dus\r\n", dt);

XTime_GetTime(&t1);
memcpy(Dst, Src, DMA_LENGTH*sizeof(int));
XTime_GetTime(&t2);
dt = (u32)(t2-t1) * (1000000.0/ COUNTS_PER_SECOND);
xil_printf("dt=%dus\r\n", dt);

测试结果

image

可以看到,最慢的是for循环copy,时间是691us。其次是dmac,时间是114us。最快的是27us。

image

将容量增大到655536*sizeof(int),结论仍然是这样的。memcpy最快。