1、准备工作(以S32DS为IDE为例)
话不多说,我人为制造一次hardfault。
由上图所示,我把0作为除数,这样运行的时候,会进hardfault。
2、进入之前的寄存器和汇编代码
这时,我们看一下,main函数的入口地址,后面会遇到。
3、运行…进入hardfault
这个时候,可以看一下寄存器的值。
看到lr寄存器的值是0xFFFF FFF9,表示中断返回时从MSP堆栈恢复寄存器的值。只使用MSP不使用PSP堆栈。
(0xFFFF FFF1 从中断返回到另一个中断;0xFFFF FFFD OS处理完中断后返回用户程序)
从SP寄存器看到堆栈地址,并查看之。
从堆栈地址往前数6*4个字节,看到主函数的地址,那就是进入hardfault的地方了。
另外,补充存储器的读法,
左边是地址,比如2001FFF0,表示这一行基地址就是这个。右边8-B,表示最左边的是基地址+8,右边是基地址+B。而入栈是高位先进,所以PC地址 = 0x0040 0F7C,对应到存储器里的是最高字节00在最右边,其实是40,然后是0F,最后是7C。
什么?你是说,即便知道了入口地址也不知道哪个函数进去的?
输入地址,搜索一下。
以上就是全部内容啦,如果有帮助,欢迎转发、评论,点赞,收藏。