在非法中断函数中,再调用一个函数接口,比如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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐