Zynq7000系列 PSPL交互之DDR数据读取正确性问题

PSPL交互之DDR数据读取正确性问题


文章目录

  • PSPL交互之DDR数据读取正确性问题
  • 前言


前言

之前负责PSPL交互处理时遇到的cache和DDR数据内容不一致导致读取数据错误的问题,想起来了简单记录一下


Zynq7000系列 PSPL交互之DDR数据读取正确性问题_第1张图片

Zynq的PS在运行过程中,通过DDR控制器对DDR存储器进行访问,为了加快访问速度,常常将一些数据缓存在cache中,而且不是针对一个数据数据缓存,而是一批(Xilinx称为一行,即line,一行长度为32),这样的好处是下次访问速度会加快,但是坏处也很明显,cache数据发生变化,不能马上反映到DDR中,反之亦然。当通过DMA修改DDR数据时,CPU可能还不知道发生了什么,拿到的数据还是cache中没有修改的数据,导致读写数据的错误。

解决的办法有以下两种:

调试过程中,直接禁用cache,即使用Xil_DCacheDisable();CPU将直接访问DDR内存,读写都是直接的,这会降低CPU性能,但简化了数据传输操作,属于极端方法。
使用CacheFlush和Cache Invalidate操作,CacheFlush把Cache里的数据清空,将Cache内容推到DDR中;而Cache Invalidate表示当场宣布Cache内容无效,需要从DDR中重新加载数据,即把数据从DDR中拉到Cache中。

Xil_DcacheFlushRange((u32)sendram,sizeof(buffer));
//将内容刷新至DDR
Xil_DcacheInvalidRange((u32)recvram,sizeof(buffer));
//将DDR内容拉近Cache中
#include "xil_cache.h"
//上述函数头文件

你可能感兴趣的:(学习FreeRTOS,FreeRTOS)