16868人阅读
Cortex-M3/M4(5)
假设IDE环境为Keil,芯片为STM32F103。
在stm32f10x_it.c中,添加软件断点,一旦调试时出现Hard Fault则会在停在__breakpoint(0)处。
This function handles Hard Fault exception.
* @retval None
void HardFault_Handler(void)
/* Go to infinite loop when Hard Fault exception occurs */
if (CoreDebug-&DHCSR & 1) {
//check C_DEBUGEN == 1 -& Debugger Connected
__breakpoint(0);
// halt program execution here
当进入Hard Fault断点后,菜单栏Peripherals &Core Peripherals &Fault Reports打开异常发生的报告,查看发生异常的原因。
上面的报告发生了BUS FAULT,并将Fault的中断服务转向Hard Fault。
相对于检测发生了什么异常,定位异常发生位置显得更重要。
(1)打开Call Stack窗口(如下图左侧,断点停在Hard Fault服务程序中)
(2)在Call Stack的HardFault_Handler上右键Show Caller Code(有的Keil版本也可以直接双击)
这时将跳转到发生异常的源代码位置(如上图),异常发生在p-&hour=0这一行。这里错误很明显:指针p尚未为成员变量分配内存空间,直接访问未分配的内粗空间肯定出错。
再说明2点:
[1] 在复杂的情况下,即使定位了异常发生位置也很难容易的改正错误,要学会使用Watch窗口对发生错误的指针变量进行跟踪;
[2] 在问题不明晰的情况下,尝试分析反汇编代码,就自己遇到的,部分情况下的异常发生在BL等跳转指令处,BL跳转到了不合法的内存地址产生异常
Refrences:
[1] Application Note 209.&Using Cortex-M3 and Cortex-M4 Fault Exceptions.&
[2] Cortex-M3权威指南
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1420144次
积分:12873
积分:12873
排名:第799名
原创:188篇
转载:44篇
评论:560条
博客内文章若存在图片或格式问题,请移步到备份
文章:17篇
阅读:177339
文章:10篇
阅读:197191后使用快捷导航没有帐号?
查看: 9054|回复: 11
请教版主如何快速解决hardfaultexception问题
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
在某次调试时发现程序运行一段时间后系统会进入hardfaultexception,看了论坛里很多相关的帖子,大致有所了解
想请教的是,出现这种情况时如何调试找到问题的根源?怎样获知程序运行到哪一步后发生错误进入hardfaultexception中断?如何能看出进入该中断前程序运行的过程?
(123.88 KB)
下载次数:3
&&&&&&&&&&
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&在hardfaultexception处设断点,调试停在断点处后看堆栈,一般都能找到从哪里进入的。
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
按照你说的操作了下,但查看call stack,内容就如我第一帖中的附图,看不出是从哪里进入到该中断
还是我没理解对?
仔细看下了程序,发现有处蓝色光标,附图中的蓝色光标代表什么意思?
(36.23 KB)
下载次数:1
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&蓝色光标一般表示程序指针指向的地方,但要看什么时候出现的。
在线时间10 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
这次最近一次调试的截图,堆栈中出现了不同的函数,具体应该怎样分析呢?
(113.49 KB)
下载次数:2
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&分析堆栈中出现的最后一个函数,从PC指针指向的位置查,看看哪里有溢出等问题。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
我还是有点不大明白
如图中标注所示:
显示caller是0x,但是查到该处代码是MOVS r0,r0
这说明什么问题?
程序进入hardfaultexception死循环时通用寄存器值如图,有没有异常?能说明什么问题?
堆栈中显示函数调用关系,
(229.66 KB)
下载次数:2
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
在出现Hardfault之后,再去看CallStack是没有意义的,CallStack记录的已经是出错以后的地址了。
所以,应该是根据CoreRegister中的R13(SP),找到当前使用的堆栈地址,通过该地址直接查看堆栈中保存的内容。堆栈中应该保存有最后一次的函数调用地址,和一些变量的值,仔细分辨,0x08开头的就是函数调用地址,这是最后一次正确的函数调用地址。
你可以在这个函数处加一个断点,然后再单步调试,你就会发现是哪一句指令导致的HardFault。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
谢谢vigia指点!!
你在最后提到断电调试,可是我现在的情况是一开始测试是正常的,经过一段时间后才发生该故障,如果我一开始设断点,程序仍是正常运行的,故障点就出不来了。
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
首先,你仍然可以用我说的方法,把出问题的地方大致定位出来,然后仔细检查相关代码,运气好的话,你就能发现问题。
要是运气不好,就多加测试手段了,比如在相关地方通过I/O口输出波形,能进一步缩小问题范围,或者记录所有相关变量的值,特别是数组和指针变量的值,出了问题就去检查所有这些保存下来的数值是否有可疑的地方。调试办法很多,自己想想吧。
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
多谢vigia大侠指引!我试试。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
按照版主和vigia大侠的思路进行调试,还是没发现故障点。
通过堆栈查看寄存器值。
1处:先前PC指针为0x,这个地址好像有点奇怪,在汇编代码窗口中定位到该处代码,入口应该是0x?
2处:先前LR寄存器值,定位到该处,汇编代码为MOVS r0,r0
(182.52 KB)
下载次数:0
Powered by
逛了这许久,何不进去瞧瞧?程序下载问题和程序跳进HardFault_Handler()死循环问题 - ARM技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
程序下载问题和程序跳进HardFault_Handler()死循环问题
22:17:30
刚学ARM的单片机。STM32F103c8t6。
1、请问J--flash ARM里面没有c8t6的Program。。怎么办,这样是不是就不能用J--flash给单片机下载程序了呢??
2、用J--Link和Keil仿真。
程序很简单,用ISP下载么问题的。可用J--Link和Keil一仿真,好像没进主程序就直接跳进HardFault_Handler()里。大家能看出有什么问题么。
#include &stm32f10x.h&
int main()
{GPIO_InitTypeD
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
a.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
a.GPIO_Speed=GPIO_Speed_10MHz;
a.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &a);
GPIOA-&ODR=1;
19:33:00
弄了一天还是不知道问题在哪里。自己顶一下。ORZ
17:13:43
过了几天了,自己再顶一下。
自己顶应该没事吧。
08:35:19
最后一次顶一下。因为问题还没解决。
等待验证会员
08:22:34
顶,遇到了同样的问题
助理工程师
11:46:24
下个例程看看& && && && && && && && &
FPGA是当前很热门的技术。
发展到现在,FPGA器件由早期的纯逻辑粘合发展到如今的可编程片上系统(SOC),FPGA应用的领域愈发广泛,开发难度和复杂度也越来越大。
那么究竟如何才能高效学习好FPGA技术呢?
每天选一个需要解决的问题,大家一起来帮忙。
授人玫瑰,手有余香
USB Type-C终结了长期以来USB需要通过试错法来多次重插的历史,一个接口搞定了电能、数据、音视频数据三种传输需求,形成接口和电缆以及快速充电协议的大统一。
预计2017年全球所有新发布手机都将采用USB Type-C接口和USB PD供电协议,将将引发手机行业革命。
Powered by