14.2 EDK / Zynq - 在PL上添加CIP pcore并使用开箱即用的软件驱动程序代码,将源缓冲区和目标缓冲区设置为ddr时不起作用
描述
我为Zynq创建了一个自定义IP并将其添加到PL上。我使用CIP生成的驱动程序软件代码来运行测试。在ddr中设置源缓冲区和目标缓冲区时,它不起作用。为什么?解
这是因为默认情况下在独立BSP中启用缓存。
有几种方法可以达到预期的效果。
1)在main.c代码中禁用缓存;它应该工作正常。
#include“xil_cache.h”
Xil_DCacheDisable();
2)在自测试示例中,在写入DDR之后和继续下一步之前刷新缓存。
for(Index = 0; Index <CIP_AXI4_MASTER_SELFTEST_BUFSIZE; Index ++)
{
SrcBuffer [指数] =指数;
DstBuffer [Index] = 0;
}
xil_printf(“*******刷新数据缓存!!! \ n \ r”);
Xil_DCacheFlushRange( (unsigned int) SrcBuffer,CIP_AXI4_MASTER_SELFTEST_BUFSIZE);
Xil_DCacheFlushRange( (unsigned int) DstBuffer,CIP_AXI4_MASTER_SELFTEST_BUFSIZE);
xil_printf(“ - 启动用户逻辑主模块以从源接收单词\ n \ r”);
3)“仅”刷新src缓冲区,然后启动cip并最终在执行比较之前使目标缓冲区无效,以强制从主DDR(而不是缓存)读取。
for(Index = 0; Index <CIP_AXI4_MASTER_SELFTEST_BUFSIZE; Index ++)
{
SrcBuffer [指数] =指数;
DstBuffer [Index] = 0;
}
xil_printf(“*******仅为源代码刷新数据缓存!!! \ n \ r”);
Xil_DCacheFlushRange((unsigned int)SrcBuffer,CIP_AXI4_MASTER_SELFTEST_BUFSIZE);
xil_printf(“ - 启动用户逻辑主模块以从源接收单词\ n \ r”);
/ ****来自selftest的更多代码**** /xil_printf(“*******使目标数据缓存无效以强制正确读取!!! \ n \ r”);
Xil_DCacheInvalidateRange((unsigned int)DstBuffer,CIP_AXI4_MASTER_SELFTEST_BUFSIZE);
/ ***按照原始代码进行内存比较*** /