[X]关闭

ZYNQ DMA或者PL直接访问DDR的时候Xil_DCacheFlushRange函数什么时候使用的解答

文档创建者:uisrc
浏览次数:7259
最后更新:2019-07-16
有不少客户问过我们在lwip tcp或者DMA传输测试例子中有用到Xil_DCacheFlushRange函数,而在做DMA摄像头采集的时候又没有使用这个函数。
以下是我从网上收集的关于ZYNQ PL 访问PS DDR 以及cache方面的说明,我认为可以很好回答以上的问题。
PL硬件加速需要如下几个步骤完成:
1,利用PS中ARM的预先存储待处理的图像数据至DDR中;
2,通过数据通道将DDR中的图像数据传送至PL中;
3,使用FPGA进行图像处理算法设计;
4,通过数据通道将FPGA处理之后数据送回至DDR中;
5,PS中ARM将处理之后的图像数据读出。
模块框图如下所示:
        通过模块框图可以看到,系统中数据流向分为两大块,即:①、⑤和②、③、④。
传输方案的选取:
        由于我们采用PS与PL协同操作,因此选择一个合适的系统传输方案是实现高效系统的保障,我们首先分析数据吞吐量从而寻找可能存在的性能瓶颈。我们的最终目标是实现视频的实时处理与分析,由于实时视频的数据量大,运算量高,因此我们必须要选择传输速度快,总线位宽高的传输总线。鉴于我们的数据是存放在DDR中的,那么较理想的传输方案即AXI_HP和PL内DMA的传输,与其他传输方式相比,它具有高数据吞吐量以及多个接口等优势。
Cache问题:
Cache最初的目的是为了加快ARM和DDR之间的交互速度,将一部分缓存存储在DDR中,当ARM需要去访问DDR中数据时,如果cache中已经有了相应的缓存(即“cache命中”),ARM就会直接访问cache中的数据,从而提高运行速度。当我们使用FPGA进行加速时,FPGA会绕过cache对DDR中的数据进行读写从而cache中该部分缓存(如果之前缓存过)是已经过时的数据,然而cache本身并不知道该数据被FPGA修改过,仍然认为缓存的数据时正确的,从而ARM无法读取到正确的数据。
解决方法:在ARM对相应的内存访问之前需要通知cache,该段内存的cache无效,从而ARM才能够直接访问到DDR中的数据。对于zynq裸机下的操作,可以直接使用Xilinx提供的BSP中的相应的Xil_DCacheFlushRange()函数。而在嵌入式linux开发环境下,方法较为复杂,核心的部分就是在内核空间中申请一致性DMA缓冲区,即调用dma_alloc_coherent()函数。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则