Hardfault应该如何调试呢?

[复制链接]
1392|12
手机看帖
扫描二维码
随时随地手机跟帖
电子玩霸| | 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

粉丝