OpenAMP项目在Zynq7平台上的内存映射问题解析
问题背景
在嵌入式系统开发中,OpenAMP作为一个开源框架,为异构多核处理器间的通信提供了重要支持。近期有开发者在使用Petalinux 2024.1版本在Zynq7平台上测试rpmsg-echo功能时,遇到了一个关键的内存映射断言错误。
错误现象
开发者报告在运行rpmsg-echo测试时,系统触发了以下断言错误:
assertion "physaddr == (void *)pa" failed: file "/build/plnx-dtc/components/yocto/workspace/sources/openamp-fw-echo-testd/openamp-fw-echo-testd/openamp_echo_test_bsp/ps7_cortexa9_1/libsrc/libmetal_v2_7/src/libmetal/lib/system/generic/xlnx/sys.c", line 137, function: metal_machine_io_mem_map
临时解决方案
开发者通过修改platform_info.c文件中的物理地址定义,暂时解决了这个问题:
- static metal_phys_addr_t scugic_phys_addr = SCUGIC_DIST_BASE;
+static metal_phys_addr_t scugic_phys_addr = SCUGIC_PERIPH_BASE;
根本原因分析
经过项目维护者的深入调查,发现问题的根源在于Xilinx BSP文件中的内存管理单元(MMU)处理逻辑存在缺陷。具体来说,在xil_mmu.c文件中,物理地址对齐处理存在错误。
正确的修复方案应该是修改BSP中的内存映射函数:
diff --git a/lib/bsp/standalone/src/arm/cortexa9/xil_mmu.c b/lib/bsp/standalone/src/arm/cortexa9/xil_mmu.c
index 9e15c6aff4..14944794ba 100644
--- a/lib/bsp/standalone/src/arm/cortexa9/xil_mmu.c
+++ b/lib/bsp/standalone/src/arm/cortexa9/xil_mmu.c
@@ -192,7 +192,7 @@ void* Xil_MemMap(UINTPTR PhysAddr, size_t size, u32 flags)
return (void*)PhysAddr;
/* Ensure alignment on a section boundary */
- PhysAddr &= ARM_AR_MEM_TTB_SECT_SIZE_MASK;
+ Ttbaddr = PhysAddr & ARM_AR_MEM_TTB_SECT_SIZE_MASK;
平台支持说明
需要注意的是,Zynq7000平台已经不再受到OpenAMP项目的官方支持。这意味着虽然上述修复方案可以解决问题,但项目维护团队不会为这个平台发布新的修复补丁。
技术建议
对于仍在Zynq7000平台上使用OpenAMP的开发者,建议:
- 采用上述修复方案解决当前的内存映射问题
- 考虑迁移到更新的硬件平台以获得更好的支持
- 自行维护针对Zynq7000平台的特定修改
这个案例也提醒我们,在使用开源项目时,及时关注项目的支持状态和生命周期非常重要,特别是在嵌入式系统开发这种对平台依赖性较强的领域。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



