Hardfault应该如何调试呢?

[复制链接]
2111|12
 楼主| 麦克塔维什 发表于 2017-9-28 15:43 | 显示全部楼层 |阅读模式
我们仿真的时候会经常进去Hardfault这个错误,该如何对这个进行跟踪调试呢?
电子玩霸 发表于 2017-9-29 10:34 | 显示全部楼层
在NVIC中有一个硬fault状态寄存器(HFSR),它指出产生硬fault的原因。如果不是由于取向量造成的,则硬fault服务例程必须检查其它的fault状态寄存器,以最终决定是谁上访的。
布拉格梦语 发表于 2017-9-29 10:37 | 显示全部楼层
一般来说,导致Hardfault的原因有哪些呢?
wodelqbz 发表于 2017-9-29 15:27 | 显示全部楼层
布拉格梦语 发表于 2017-9-29 10:37
一般来说,导致Hardfault的原因有哪些呢?

STM32出现HardFault_Handler故障的原因主要有两个方面:
1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码。
2、堆栈溢出,增加堆栈的大小。
zhangyi3312 发表于 2017-9-29 15:30 | 显示全部楼层
导致异常的原因很多,例如:直接使用未分配空间的指针、栈溢出等一场非法操作便会使程序进入HardFault异常状态。
jermy_z 发表于 2017-9-29 21:26 | 显示全部楼层
查看堆栈SP寄存器的值,找到跳转的地址,就找到导致异常的原因了
几时再见 发表于 2017-9-29 21:31 | 显示全部楼层
常见的异常,除了Hardfault还有哪些呢?是由于什么原因造成的呢
罗勋义 发表于 2017-9-29 22:27 | 显示全部楼层
Cortex-M3/4的Fault异常是由于非法的存储器访问(比如访问0地址、写只读存储位置等)和非法的程序行为(比如除以0等)等造成的。
爱潜泳的鱼 发表于 2017-9-29 22:31 | 显示全部楼层
常见的4种异常及产生异常的情况如下:
Bus Fault:在fetch指令、数据读写、fetch中断向量或中断时存储恢复寄存器栈情况下,检测到内存访问错误则产生Bus Fault。
Memory Management Fault:访问了内存管理单元(MPU)定义的不合法的内存区域,比如向只读区域写入数据。
Usage Fault:检测到未定义指令或在存取内存时有未对齐。还可以通过软件配置是否检测到除0和其它未对齐内存访问也产生该异常,默认关闭,需要在工程初始化时配置。
剩下的就是Hardfault异常了。
jp_chen 发表于 2017-9-30 10:04 | 显示全部楼层
假设IDE环境为Keil,芯片为STM32F103。
在stm32f10x_it.c中,添加软件断点,一旦调试时出现Hard Fault则会在停在__breakpoint(0)处。
当进入Hard Fault断点后,菜单栏Peripherals >Core Peripherals >Fault Reports打开异常发生的报告,查看发生异常的原因。这就定位到错误了,对照程序,大概就知道哪里出错了。
花落辞殇 发表于 2017-9-30 10:07 | 显示全部楼层
相对于检测发生了什么异常,定位异常发生位置显得更重要。
(1)打开Call Stack窗口(断点停在Hard Fault服务程序中)
(2)在Call Stack的HardFault_Handler上右键Show Caller Code(有的Keil版本也可以直接双击),这时将跳转到发生异常的源代码位置。
会飞的大白 发表于 2017-9-30 15:39 | 显示全部楼层
上面说的这种办法也不是万能的,有时候碰到定位不到的情况,只能再三检测程序的问题了。
nobleliom 发表于 2017-9-30 15:48 | 显示全部楼层
发生异常之后可首先查看LR寄存器中的值,确定进入异常前一刻使用的堆栈为MSP或PSP,然后找到相应堆栈的指针?
注:在HandFault_Handler(void)中断里第一条语句打断点,进入中断后,查看LR寄存器的值,如果是0XFFFFFFF9,那么中断前使用的是MSP,如果是0XFFFFFFFD,那么中断前使用的是PSP:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

101

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部