博文

由RFE指令引发的一串故事

图片
前段时间,我们在bring up一块Cortex-A5主控的芯片时,发现在跑FreeRTOS时, 系统总是crash. 通过GDB定位到一旦RFE指令执行结束后,系统便进入data abort mode. <图一> 一旦执行RFE便进入data abort <图二>, FreeRTOS中RFE相关代码片段 RFE指令如其字面含义, return from exception. 它的主要作用是: 从栈中弹出值分别赋值给cpsr和pc. 这条指令在恢复现场时,具有不可替代的作用(如果用其他指令来代替同样的功能, 自然就污染其他寄存器了). RFE指令在ARM v7 spec中的伪码: <图三>,RFE指令的伪码 曾经一度怀疑是Cortex-A5的errata,但是CPU指令级别的仿真测试对于RFE指令是没有问题的。而且,之前在FPGA上做预开发的时候,在FPGA平台上也没有发现此类问题。所以,一度陷入到困局中,没有思路。 如果整个FreeRTOS来让SOC仿真,那么仿真的时间会比较久,因此我们写了下面一段比较小的代码来进行仿真测试。但是仿真下来并没有发现问题。 _start:     ldr r0, =vectors     mcr p15, 0, r0, c12, c0, 0   // PLD Capablity     mrc p15, 0, r0, c0, c2, 2 //MAIN IDR     mrc p15, 0, r0, c0, c0, 0 // CCSIDR     mrc p15, 1, r0, c0, c0, 0     cps #0x17     ldr r0, =0x30009000     str r0, [r0]     ldr r0, =0x10009000     mov sp, r0     cps #0x1f     ldr r0, =0x10008000     mov sp, r0     mrs r0, cpsr     bic r0, r0, #0x80               msr cpsr_c, r0     svc #0                      // trigger one soft interrupt.     b .     nop     nop