OpenAMP项目在Zynq7平台上的内存映射问题解析

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的开发者,建议:

  1. 采用上述修复方案解决当前的内存映射问题
  2. 考虑迁移到更新的硬件平台以获得更好的支持
  3. 自行维护针对Zynq7000平台的特定修改

这个案例也提醒我们,在使用开源项目时,及时关注项目的支持状态和生命周期非常重要,特别是在嵌入式系统开发这种对平台依赖性较强的领域。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值