You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ZYNQ 7000(ARM A9)裸机Core1数据中止原因排查求助

ZYNQ 7000 Core1 裸机数据中止问题排查

我使用搭载2个ARM A9内核(Core0与Core1)的ZYNQ 7000 SoC,裸机环境下Core1代码偶尔触发数据中止。在默认数据中止处理函数Xil_DataAbortHandler中捕获到:

  • FaultStatus为0x1e
  • DataAbortAddr为0x2001bc9c

用readelf -s a.elf查看符号表,未找到与0x2001bc9c完全匹配的函数地址,最接近的是位于0x2001bc64的Xil_L2CacheDisable函数——这是Xilinx BSP库函数,我用它实现两核共享内存的直接访问。请问这是否意味着数据中止由Xil_L2CacheDisable引发?


捕获DataAbortAddr的汇编代码

DataAbortHandler:               /* Data Abort handler */
#ifdef CONFIG_ARM_ERRATA_775420
    dsb
#endif
    stmdb   sp!,{r0-r3,r12,lr}      /* state save from compiled code */
    ldr     r0, =DataAbortAddr
    sub     r1, lr, #8
    str     r1, [r0]                    /* Stores instruction causing data abort */

    bl  DataAbortInterrupt      /*DataAbortInterrupt :call C function here */

    ldmia   sp!,{r0-r3,r12,lr}      /* state restore from compiled code */

    subs    pc, lr, #8          /* points to the instruction that caused the Data Abort exception */

捕获FaultStatus的C代码

#define mfcp(rn)    ({u32 rval = 0U; \
             __asm__ __volatile__(\
               "mrc " rn "\n"\
               : "=r" (rval)\
             );\
             rval;\
             })
#endif
#define XREG_CP15_DATA_FAULT_STATUS     "cp15:0:c5:c0:0"

u32 FaultStatus = mfcp(XREG_CP15_DATA_FAULT_STATUS);

问题分析与结论

  1. 地址关联判断:DataAbortAddr是触发异常的指令地址,0x2001bc9c与Xil_L2CacheDisable的起始地址0x2001bc64相差0x38(56字节),说明异常发生在该函数内部的某条指令上,而非函数调用处。缓存配置类函数本身涉及对CP15寄存器或缓存硬件的底层访问,属于异常高发操作。
  2. FaultStatus 0x1e解析:ARM A9的CP15数据故障状态寄存器(DFSR)中,0x1e对应外部同步数据中止,通常是访问的外设/内存未就绪、核间操作冲突(比如Core0同时操作缓存或共享内存)导致。
  3. 核间同步隐患:裸机环境下若调用Xil_L2CacheDisable时未做核间同步,Core0可能仍在使用L2缓存,此时Core1修改缓存配置会引发总线访问冲突,进而触发数据中止。

结论:数据中止大概率是Xil_L2CacheDisable函数执行过程中引发的,核心原因可能是核间缓存操作未同步或共享内存访问时序问题。

内容的提问来源于stack exchange,提问作者Jackoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:31:05