RZN2L使用backtrace时,栈地址不对
问题
在使用RZN2L进行backtrace实验时,发现在进入Abort中断后栈顶指针也发生了很大的变化,猜测是因为RZN2L默认运行在SVC模式,而进入Abort后切换到了IRQ模式,导致栈顶地址错误。
RZN2L在system_init函数设置成SVC模式
1 2 3 4 5 6 7
| __asm volatile ( "cpsr_save: \n" " MRS r0, cpsr \n" /* Read original CPSR value to r0 */ " BIC r0, r0, %[bsp_mode_mask] \n" /* Clear the mode bits */ " ORR r0, r0, %[bsp_svc_mode] \n" /* Set value of SVC mode bits */ " MSR SPSR_hyp, r0 \n" /* Write r0 to SPSR_hyp */ ::[bsp_mode_mask] "i" (BSP_MODE_MASK), [bsp_svc_mode] "i" (BSP_SVC_MODE) : "memory");
|
解决方法
在Abort中断函数切换回SVC模式,再进行lr,sp寄存器的获取
1 2 3 4 5 6 7 8 9 10 11
| __asm volatile ( "mrs r0, cpsr \n" "bic r0, r0, %[bsp_mode_mask] \n" "orr r0, r0, %[bsp_svc_mode] \n" "msr cpsr, r0 \n" "push {lr} \n" "mov r0, lr \n" "mov r1, sp \n" "bl backtrace_fault \n" ::[bsp_mode_mask] "i" (BSP_MODE_MASK), [bsp_svc_mode] "i" (BSP_SVC_MODE) : "memory" );
|
backtrace介绍
backtrace介绍