S32K1XX调试--快速定位HardFault

1、背景

  • 程序运行,发现程序跑飞到HardFault,但不清楚为什么会跑到HardFault中断处理函数去。

2、分析

  • 要想知道为什么会跑到HardFault_Handler中去,就很有必要了解一下,程序上一条执行的是那条命令。

  • 根据汇编指令可以定位上条指令,但如果对汇编指令不是很了解的话,那就很头疼了

  • 根据单步运行也能实现定位,但如果程序量很大,又很杂,可能花费的时间就比较久些。

3、问题查找

  • 提供一种不需要懂汇编指令的查找方法,方法如下:
  • 在中断处理函数中插入以下代码,以及另外定义一个函数getStackFrame来存之前函数的寄存器值。
void HardFault_Handler(void)
{
// LR provides information of the return stack PSP/MSP
	asm("MOVS R0, #4");
	asm("MOV R1, LR");
	asm("TST R0, R1");
	asm("BEQ _MSP");
	asm("MRS R0, PSP");
	asm("B getStackFrame");
	asm("_MSP:");
	asm("MRS R0, MSP");
	asm("B getStackFrame");
}
 
void getStackFrame(uint32_t *stackFrame)
{
	uint32_t r0,r1,r2,r3,r12,lr,pc,psr;
	r0  = stackFrame[0];
	r1  = stackFrame[1];
	r2  = stackFrame[2];
	r3  = stackFrame[3];
	r12 = stackFrame[4];
	lr  = stackFrame[5];
	pc  = stackFrame[6];  
	psr = stackFrame[7];	/* 确保已经运行 */
	asm("BKPT");
}
  • 运行程序,在以上程序pc变量获取值之后打断点,查看pc的值,然后打开反汇编窗口(不同编译器,操作不同,这里不做说明),跳转到pc值对应的地址,查看他对应的是哪个函数
  • 跳转结果如下,我获取到的pc值为0x20000069,其对应的函数是FLASH_DRV_CommandSequence,所以可以确定是处理这个函数后导致的硬件错误中断

在这里插入图片描述

4、拓展

  • 其他一些特殊问题处理应该也可以以这种方法定位上条指令

其他

编写或是解释难免有错,欢迎指正。
如有侵权,联系我删除,谢谢!!!

另附参考链接:
[1]. https://community.nxp.com/t5/S32K/problem-about-HardFault-Handler/m-p/683869void%20getStackFrame(uint32_t%20*stackFrame)

  • 2
    点赞
  • 2
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

ping_devil

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者