C语言 网站favicon图标制作 Git Java中高进阶架构 pdf recursion kubernetes plugins primefaces ros 打印 cassandra triggers flexbox callback laravel4 Material UI 管理后台模板 后台网站模板 后台管理模板 十大erp系统 郑州网站开发 js鼠标离开事件 bootstrap图表 hadoop源码 java清空数组 mysql合并结果集 mysql自连接 python3删除文件 python参数 python语言编程入门 python中集合 python读取字典 java正则表达式匹配 java中continue java特性 groupby 飞猪ip mac画图软件 思源黑体cn 千千静听老版本
当前位置: 首页 > 学习教程  > 编程语言

S32K1XX调试--快速定位HardFault

2020/9/19 14:48:30 文章标签:

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)


本文链接: http://www.dtmao.cc/news_show_200184.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?