解决:
dma应该只有一个硬件设备(固定映射),然后一个dma顺序完成不同的写任务。
bram ctrl的映射地址是edit addr的那个,但是不能直接使,要用宏定义的那个数(后面多了一个U,我也不知道为啥)。找自己的bram ctrl的base宏定义是什么名字要去xparameters.h找,看名字找,好像没有表格。。。
路径:bsp的include里面
重要!记得类型转换成(int *)!!!!!!!!!!!!!!!!!!!!!!
static int * Src = (int*)XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR;
看源码有点乱,dma怎么实现的内外存?内存就是用数组表示就行,外存的地址怎么找的?
1.好像是用DmaCmd的bd结构体先赋值?
问题是dma怎么获得的外存地址?
DmaCmd.ChanCtrl.SrcBurstSize = 4;//设置cmd参数 DmaCmd.ChanCtrl.SrcBurstLen = 4; DmaCmd.ChanCtrl.SrcInc = 1; DmaCmd.ChanCtrl.DstBurstSize = 4; DmaCmd.ChanCtrl.DstBurstLen = 4; DmaCmd.ChanCtrl.DstInc = 1; DmaCmd.BD.SrcAddr = (u32) Src;//写 DmaCmd.BD.DstAddr = (u32) Dst; DmaCmd.BD.Length = DMA_LENGTH * sizeof(int);
写dma的时候只初始化了src的值,dst清零了,两个空间都是在内存里:
/* Initialize source 给源数据赋值*/ for (Index = 0; Index < DMA_LENGTH; Index++) Src[Index] = DMA_LENGTH - Index; /* Clear destination 清空结果数组*/ for (Index = 0; Index < DMA_LENGTH; Index++) Dst[Index] = 0;
dma回读的代码如下:
int *Src;//局部变量 int *Dst; Src = (int *)DmaCmd->BD.SrcAddr;//重新赋值?src不是全局变量吗?为什么不直接使? Dst = (int *)DmaCmd->BD.DstAddr;
/* compare the src and dst buffer */ for (Index = 0; Index < DMA_LENGTH; Index++) { if ((Src[Index] != Dst[Index]) || (Dst[Index] != DMA_LENGTH - Index)) { Status = -XST_FAILURE; } }
2.助教的示例中,将src的值变为板上地址?
在示例工程的源代码中,修改第 121行代码 为 static int * Src = (int*)XPAR_AXI_BRAM_CTRL_0_S_AXI_BASEADDR; 即可实现内存与 PL缓存之间的数据传输。
板上地址获得:看platform文件,直接抄就可以吗?是不是已经做了虚拟存储mma了?
3.不用dma,直接往bram的地址写也可以,用自带的out函数
https://blog.csdn.net/NarutoInspire/article/details/79401559?utm_source=blogxgwz7