由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