问题描述
我在EDK 8.2i SP#2中使用创建/导入外设向导创建了一个支持DMA的自定义IP(my_custom_ip)。
当我运行XPS向导创建的自测试示例时,DMA自检代码失败。
PLB和OPB基于IPIF的自定义IP都会出现此问题。
解决/修复方法
问题出在“my_custom_ip_selftest.c”中,与简单DMA源和目标缓冲区的缓冲区分配有关。
通常,这些缓冲区应与总线大小对齐(即,对于PLB IPIF,它们应与64位对齐)。但是,在代码中,它们不会被强制为64位对齐,而是留给编译器在编译时分配它们。
要解决基于PLB IPIF的IP的问题,应使用Compiler属性对这些缓冲区进行64位对齐。
以下代码由向导在“my_custom_ip_selftest.c”中生成:
static Xuint8 SrcBuffer [DMA_TEST_HW_SELFTEST_BUFSIZE]; / *源缓冲区* /
static Xuint8 DstBuffer [DMA_TEST_HW_SELFTEST_BUFSIZE]; / *目标缓冲区* /
应该使用Compiler属性,如下所示,强制缓冲区为64位对齐:
static Xuint8 __attribute __((aligned(64)))SrcBuffer [DMA_TEST_HW_SELFTEST_BUFSIZE]; / *源缓冲区* /
static Xuint8 __attribute __((aligned(64)))DstBuffer [DMA_TEST_HW_SELFTEST_BUFSIZE]; / *目标缓冲区* /
对于基于OPB IPIF的自定义IP,必须使用相同的方法将对齐强制为32位:
static Xuint8 __attribute __((aligned(32)))SrcBuffer [DMA_TEST_HW_SELFTEST_BUFSIZE]; / *源缓冲区* /
static Xuint8 __attribute __((aligned(32)))DstBuffer [DMA_TEST_HW_SELFTEST_BUFSIZE]; / *目标缓冲区* /
此问题将在EDK工具的未来版本中修复。
没有回复内容