Vivado使用心得(七)Zynq Cache问题的解决方法

本文探讨了在Vivado中处理Zynq Cache一致性问题,特别是DMA传输时遇到的问题。介绍了禁用Cache、使用Xil_DCacheFlushRange和Xil_DCacheInvalidateRange函数来管理Cache,并在Linux环境下如何利用dma_sync_single_for_device和dma_sync_single_for_cpu进行同步。此外,还提及了在裸机和Linux开发中的调试区别。
摘要由CSDN通过智能技术生成

​    在进行PS-PL之间的DMA传输时,不可避免会遇到Cache问题。今天在这里讲一下Cache的解决方法。其中参考了forums.xilinx.com的处理方法。

首先解释为什么DMA会引入Cache问题(专业名称为Cache一致性问题)。

    PS和PL都在独立运行,PS通过DDR控制器来对DDR存储器进行访问,为了加速,常常将一些数据缓存(Cache),而且不是针对一个数据缓存,而是针对一批(Xilinx称为一行,即Line,一行长度为32)。这样好处很明显,下一次访问速度会加快;但坏处也很明显,就是Cache里的数据如果发生了改变,不能迅速反映到DDR2实际数据中,反之亦然。因此,当PL通过DMA修改了DDR2数据时,CPU可能还不知道发生了些什么,拿到的数据仍然是Cache中的没有改过的数据。

    在裸机开发时,规避Cache最简单的方法就是禁用Cache。

    #include "xil_cache.h";

    void Xil_DCacheDisable(void);

    这样操作后,CPU将直接访问DDR内存,读写都是直接的。这样显然会降低CPU性能,但简化了数据传输操作,属于极端的方法。

 

    另外一种操作要多加一道手续,从字面理解,Flush就是把Cache里的数据流放出去,清空Cache,也就是将Cache的内容推到DDR中去;而Cache Invalidate表示当场宣布Cache里的内容无效,需要从DDR中重新加载,即把数据从DDR中拉到Cache中来。

    理解了这个原理&

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值