|
发表于 2014-9-18 15:03:37
|
显示全部楼层
ARM cortex-M 系列 HardFault的诊断: http://www.rt-thread.org/phpBB3/topic2300.html
问题追踪
上面测试出了问题,是我们人为设置的故障,但在平时调试中出了问题如何追综呢?
以非对齐访问为例,开发环境使用MDK。
1. 进入JTAG仿真状态,并触发非对齐异常。
此时串口会打印出异常时的寄存器值,此时停止仿真器发现程序停在rt_hw_hard_fault_exception中。
2. 根据上面打印出来的寄存器,提取出关键值是 pc: 0x08000386
我们在MDK的command窗口中输入 pc = 0x08000386
- 239: p = (int *)0x03;
- 0x08000384 2403 MOVS r4,#0x03
- 240: value = *p;
- 0x08000386 6820 LDR r0,[r4,#0x00]
- 0x08000388 9000 STR r0,[sp,#0x00]
复制代码
分析 #386 这条指令从 R4+0 的问题读取4字节到R0中,
先前打印出的R4的值为 r04: 0x00000003
因此可以确定为这是因为地址不对齐造成的。
当然,具体情况要具体分析,有时候某个步骤出现问题并不会马上崩溃,
而是过一段时间以后才出问题,因此要结合上下文综合分析。
比如上面这个案例真正有问题的指令是 0x08000384。
根据以上的案例,并结合实际调试经验,相信大家可以更快地找出问题。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|