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)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值