PYNQ开发板使用-使用DMA进行数据搬移-Scatter Gather(sg) DMA transfer 模式

上一篇使用了axi_cdma的简单传输模式,发现在板级支持包里有他的SG_intr和SG_poll模式的使用例程。因此想尝试sg模式在并发处理上的效果。本篇目的:学习如何使用AXI_CDMA_SG_MODE,并且与上一篇simple Mode的工作效率进行对比。(目前应用中出现了某个配置上的错误导致传输中断,打印状态寄存器发现是DMA解码错误,使用的就是官方例程bsp_xaxicdma_example_sg_intr。具体排查在文末)

目录

1 AXI_CDMA

1.1 什么是Scatter Gather Mode

1.2 Scatter Gather Mode配置步骤

1.3 AXI_CDMA中断配置:中断合并和中断延时

2 AXI_CDMA硬件平台:fpga资源分配和设计

3 SDK工程建立及运行

4 打桩排查流程

5 拟解决方案


1 AXI_CDMA

   AXI_CDMA是xilinx的一个IP核,可以从官网找的其手册《AXI Central DirectMemory Access v4.1》,放一个该IP核的原理图

                                         PYNQ开发板使用-使用DMA进行数据搬移-Scatter Gather(sg) DMA transfer 模式

该图对应第二章的axi_cdma_0  IP,由axi_smc桥接ps端,支持高速的axi hp协议。

1.1 什么是Scatter Gather Mode

     “Scatter Gather是一种机制,它允许通过传输描述符的预编程指令列表自动进行数据传输调度。 该指令列表由您的软件应用程序编程为必须由AXI CDMA SG接口访问的内存驻留数据结构。 该指令列表被组织成所谓的传输描述符链。 每个描述符都有一个指向要处理的下一个顺序描述符的地址指针。 链中的最后一个描述符通常指向链中的第一个描述符,但这不是必需的。”

以上简介来自AXI_CDMA ip使用手册,说的有点笼统,但是有两个重要概念:1.需要有一种可以使得AXI_CDMA可以直接访问的数据类型。2.AXI_CDMA可以按照这个类型的数据所构成的链表(是一个buffer descriptors 构成的ring,简称BDsRing )。但是这个描述中没有描述SG模式相对于简单传输模式的特征:并发性。不太清楚该IP核是如何实现并发的,但是BD ring这个结构传递给AXI_CDMA之后,该IP就可以实现BD的并发传输。工作效率应该高于简单传输模式。

要搞明白Scatter Gather机制需要进一步了解cache和DMA的关系(有关于cache DMA一致性)才能更好的理解AXI_CDMA 是如何根据BD ring来指导搬移数据的。

在阅读了AXI_CDMA_SG_INTR的SDK历程相关代码之后,我梳理出了上述Scatter Gather机制:

1)首先说明在源码中宏定义了三段地址空间:

                                       PYNQ开发板使用-使用DMA进行数据搬移-Scatter Gather(sg) DMA transfer 模式

2)其次说明BD数据结构

    PYNQ开发板使用-使用DMA进行数据搬移-Scatter Gather(sg) DMA transfer 模式  PYNQ开发板使用-使用DMA进行数据搬移-Scatter Gather(sg) DMA transfer 模式

左图是数据类型定义,所以明显BD实际上是一个一维数组,此例中将长度设为4*16个字节(16个unsigned int型成员),右图中说明了各个字分别是什么参数。

3)有了以上两处说明就可以解释通地址空间的数据在AXI_CDMA的SG传输机制中的关系:

                         PYNQ开发板使用-使用DMA进行数据搬移-Scatter Gather(sg) DMA transfer 模式

在源码中,在完成所有初始化和数据准备之后,由处理器将BD ring刷入cache,AXI_CDMA会直接获取该BDring,然后根据按照该IP内部逻辑解析BD,BD中很关键的三个成员:源数据地址,目的地址,源数据长度。DMA并发的解析BD ring中的参数并完成对应地址空间的数据搬移。在该例程中一个BD数组为64字节(BD_SPACE_HIGH - BD_SPACE_BASE)/sizeof(BD_t) = 128,即在BD ring空间最多可以存放128个BD,构成一个128*64字节的ring。本历程中使用了30个BD 即30*64字节的BD ring,该ring指导AXI_CDMA 完成了对30包数据(每包1024字节)的搬移工作。

 

1.2 Scatter Gather Mode配置步骤

在官网找的其手册《AXI Central DirectMemory Access v4.1》中,给出了最简配置,实际上应该根据SDK中的应用例程对应AXI_CDMA寄存器进行定制化的配置,下面的配置流程大致了解一下:

              PYNQ开发板使用-使用DMA进行数据搬移-Scatter Gather(sg) DMA transfer 模式

1.3 AXI_CDMA中断配置:中断合并和中断延时

本次实验使用的是bsp_xaxicdma_example_sg_intr例程,即通过中断处理函数来完成传输数据。AXI_CDMA 该IP提供中断合并和中断延时,这两个配置是协同作用的详见使用手册。简单地说应该就是不是每个完成传输状态一出现就送出一个中断信号,而是完成数目达到阈值才产生中断,但是有一种情况是最后几包数据传输完成后仍然达不到阈值,那么就会产生计时,如果计时达到延迟阈值,那么也会送出一个中断信号。这就是中断合并与中断延时配合使用的原因。至于为什么有这种设置,应该就是为了延长终端间隔,给处理器(ps)端足够的时间完成cache操作或者其他任务的相应。可以说是提高了实时性的一种设计。

 

2 AXI_CDMA硬件平台:fpga资源分配和设计

因为在手册里也没有说明与SDK中CMDA例程对应的硬件设计和配置,所以就直接使用了上一篇简单传输模式的硬件设计:

             PYNQ开发板使用-使用DMA进行数据搬移-Scatter Gather(sg) DMA transfer 模式

地址分配如下:

             PYNQ开发板使用-使用DMA进行数据搬移-Scatter Gather(sg) DMA transfer 模式

首先说明这个vivado工程应用简单传输模式进行DDR->DDR 和DDR<->BRam的一次性传输是完全没有问题的。

但是在使用官方的SG传输例程的时候遇到错,程序被正常终止。以下章节就是为了排查bug而进行的学习过程。

3 SDK工程建立及运行

1)vivado导出硬件设计,启动SDK

2)新建BSP工程

3)在system.mss文件中选择导入AXI_CDMA例程,选择bsp_xaxicdma_example_sg_intr示例工程导入

4)编译,打开sdk terminal,链接PYNQ z2开发板串口

5)烧写FPGA,JTAG启动发布应用

      串口打印:

      Connected to COM4 at 115200

       --- Entering main() --- 

       XAxiCdma_SgIntr Example Failed

4 打桩排查流程

1)在所有的判断status处进行print,发现指导最后一个接口调用结束,全都是access

2)在中断回调函数中打桩:发现全局变量Done = 0, Error = 1;其中Done是cache废止操作次数,实际上就是对已经完成传输的bd进行计         数。推测一包都没能传输。。。

3)定义全局变量来对中断处理函数的回调次数进行计数,果然发现第一次回调就出现了error。

4)获取CDMA 状态寄存器信息:##liu##XAXICDMA_SR:5040a,在传输之前状态寄存器为:##liu##XAXICDMA_SR:5000a,经过查阅         该CDMA  IP的手册,其中说明这一位置1说明是DMA解码错误:“该位指示SG引擎在AXI传输期间已收到AXI解码错误。 如果SG            Engine向无效位置发出地址请求,则会发生此错误。 此错误情况导致AXI CDMA正常停止。 CDMA完成关闭后,CDMASR.IDLE位设置为1。 当检测到此错误时,将使用描述符指针值更新CURDESC_PNTR寄存器。”

5)不太明白什么叫解析出来了一个无效地址,首先DDR基地址配置应该没有问题,因为在简单传输模式中没有问题。然后又直接PS端访问了所有地址空间:BDring空间,源数据地址空间,目的地址空间。源数据地址空间的数据与传输前初始化的一致,并且地址没有越界,目的地址也没有越界。但是sg中断传输模式下,一直会有这个解码错误。因为这个例程没有给详细的FPGA工程搭建,所以不知道是硬件连线和配置有问题,还是地址空间的分配有问题。

5 拟解决方案

1)扩展硬件知识,查看UG896,UG900,UG910深入学习一下如何搭建硬件工程。

2)有必要深入学习一下DMA与cache的一致性,可能在刷新数据和废止数据过程中找到些思路。

----------------------------------------------------------------------------------------未完待续。。