ZYNQ 7000(ARM A9)裸机Core1数据中止原因排查求助
ZYNQ 7000 Core1 裸机数据中止问题排查
我使用搭载2个ARM A9内核(Core0与Core1)的ZYNQ 7000 SoC,裸机环境下Core1代码偶尔触发数据中止。在默认数据中止处理函数Xil_DataAbortHandler中捕获到:
FaultStatus为0x1eDataAbortAddr为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);
问题分析与结论
- 地址关联判断:
DataAbortAddr是触发异常的指令地址,0x2001bc9c与Xil_L2CacheDisable的起始地址0x2001bc64相差0x38(56字节),说明异常发生在该函数内部的某条指令上,而非函数调用处。缓存配置类函数本身涉及对CP15寄存器或缓存硬件的底层访问,属于异常高发操作。 - FaultStatus 0x1e解析:ARM A9的CP15数据故障状态寄存器(DFSR)中,0x1e对应外部同步数据中止,通常是访问的外设/内存未就绪、核间操作冲突(比如Core0同时操作缓存或共享内存)导致。
- 核间同步隐患:裸机环境下若调用
Xil_L2CacheDisable时未做核间同步,Core0可能仍在使用L2缓存,此时Core1修改缓存配置会引发总线访问冲突,进而触发数据中止。
结论:数据中止大概率是Xil_L2CacheDisable函数执行过程中引发的,核心原因可能是核间缓存操作未同步或共享内存访问时序问题。
内容的提问来源于stack exchange,提问作者Jackoo
相关产品推荐
相关产品推荐

