0. 背景
Zynq FPGA的优势之一就是PS端与PL端基于高带宽的协同设计,以简化系统的硬件架构和提高系统的集成度和整体性能。例如:在某些硬件加速应用场合,PL端需要与DDR3存储芯片进行高速率的数据交互,且通常都采用DMA方式实现的。
PS端集成DMA控制器硬件单元CDMA,PL端有AXI DMA软核可以使用。整个数据交互通信链路的节点包含5个。
CPU <——> Dcache <——> DDR3 <——> XDMA <——> Stream FIFO(PL)
在无操作系统的Zynq应用中,Dcache技术的应用的优点是提高CPU访问DDR3内存的速率;但会带来一个潜在的问题:cache数据发生更新时,不能马上同步更新到DDR中,反之亦然。例如:CPU拟通过Dcache间接读取DDR3内存起始地址为0x0010_0000,长度为0x100,共计256个数据;该起始地址处开始的256个数据已被PL端刚更新过,但是Dcache尚未通过PS程序进行同步更新,则CPU从当前Dcache拿到的数据就是未更新过的数据,从而造成数据交互错误。
1. 解决方法
常见的解决方法有两种:关闭cache或更新cache
方法一:直接关闭Dcache功能;即CPU直接与DDR内存数据交互,不需要Cache的介入;该方法的弊端为:降低CPU处理数据的性能;
故,该方法不建议。例如:某人在用水果刀削苹果吃的时候,不小心被割破手指了,此人觉得是水果刀的原因,就放弃使用水果刀,以后都直接啃苹果吃。工具或策略本身无对错,错在使用它们的人,如果用在合适的场景,则会事半功倍;反之,。。。。。。
方法二:程序中,调用函数,更新cache
Xil_DcacheFlushRange(Address, Length) 该函数功能:将Cache关联地址的数据写入到DDR中,并把Cache里的数据清空;
Xil_DcacheInvalidRange(Address, Length)该函数功能:将当前Cache制定地址和长度的缓存的数据无效,则CPU就直接从DDR3中对应地址处获取数据。
3. 参考博文
链接1:https://blog.csdn.net/weixin_38712697/article/details/99693531