DMA单元学习

解决:

  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

posted @ 2018-11-25 16:36  iwanna  阅读(401)  评论(0编辑  收藏  举报