F28335进入非法中断ILLEGAL_ISR定位
·
在非法中断函数中,再调用一个函数接口,比如save_illegal_error(),然后在save_illegal_error中实现如下代码:
g_illegal_isr_sp = 0;(这个是全局变量,需要先定义 )
asm(
“ MOVW ACC, SP\n”
" MOVL @_g_illegal_isr_sp, ACC\n");
这里g_illegal_isr_sp就是当前SP的值,因为调用了save_illegal_error, RPC的值(当前异常出现现代码行的下一行)会压栈到堆栈中。
在cmd文件中,会定义堆栈的起始地址,比如0x50,使用g_illegal_isr_sp-0x50即得到要拷贝的堆栈长度,读取该长度堆栈信息,可以保存到flash或EEPROM中,这样在程序重启后,可以读出来,查看异常代码行的下一行在哪个位置,从而定位异常代码行。
读取PC指针的代码如下:
asm(" MOVW XAR0, PC\n"
“ MOVL ACC, XAR0\n”
"MOVL @_g_pc_value, ACC\n");
其中g_pc_value为全局变量uint32_t类型。
也可以写一个*.asm汇编文件,定义接口使用
.def _get_sp_value
.def _get_pc_value
.global _get_sp_value
.global _get_pc_value
_get_sp_value:
MOVW ACC, SP
LRETR
_get_pc_value:
MOVW XAR0, PC
MOVL ACC, XAR0
LRETR
更多推荐
所有评论(0)