最近调试cdma通过hp口完成bram和DDR之间的数据搬移遇到一个非常有趣的问题,也是让这边苦恼了好几天;
首先问题如下:
1.上电debug开始ddr搬数据到bram是可以看到bram搬移成功;
2.之后bram搬数据到ddr,mem查看窗口没有发现ddr对应地址段出现变化;
3.程序写这块内存,mem查看窗口ddr地址段数据有变化;
4.启动ddr该地址段搬到bram,—是之前的数据—
5.程序更新bram中的数据后搬到ddr,mem查看窗口ddr地址段数据没有发生变化;
6.启动ddr该地址段搬到bram,—是5步中bram写的数据—
总结下就是:程序改变ddr中数据会及时的更新到ddr中,但搬移到bram中还是上一次的数据;bram搬到ddr中,ddr数据没有改变,实际已经搬进来了因为下一次ddr搬出来是上一次的数据。
最开始做的实验少,没有发现这个规律,一直以为是hp和ddr的地址映射有问题,hp将数据写到ddr其他地址段了,查了好多的资料最后这边总结下来是hp地址和ddr地址是对应的,做一个全地址就好了,假如DDR是256MB那么hp总线空间直接拉满256MB如下图:
这样,使用哪段可以直接在软件里面申请malloc出来。之后这边意识到是不是被缓存了,最开始以为CDMA缓存了,CDMA中的确有个FIFO但这个FIFO是用来改善总线的;最后这边查到了这个好的博文Zynq Cache问题的解决方法
得到了解决;这边再总结下:
包含了头文件:xil_cache.h
使用到了两个函数:
void Xil_DCacheFlushRange(INTPTR adr, u32 len)
这边理解这个函数就是将cash数据flush(刷)成ddr最新数据,往外搬数据时候用;
void Xil_DCacheInvalidateRange(INTPTR adr, u32 len)
这边理解这个函数就是将cash数据放入DDR中,搬数据到DDR用;