![](/img/trans.png)
[英]simple struct dereference trigger ARM hard_fault hardware exception
[英]How to get a hard fault exception with a simple or instruction on arm
目前我们正在寻找一个幻象,它的形式是当我们在某些代码中编译(不调用它)时,对 memset 的一个特定调用会生成一个硬故障异常。
给 memset 的地址和长度是有效的。 在单指令模式下单步执行它表明它总是在 OR 指令处失败。 但是处理器决定调用 0xfffffff9,而不是计算该值,然后跳转到硬故障处理程序,原因是一条未知指令。
memset 发生的地方的反汇编:
0x80192f0 <+0x0020> 03 2c cmp r4, #3
0x80192f2 <+0x0022> 2e d9 bls.n 0x8019352 <memset+130>
0x80192f4 <+0x0024> cd b2 uxtb r5, r1
# The following line crashes
0x80192f6 <+0x0026> 45 ea 05 25 orr.w r5, r5, r5, lsl #8
0x80192fa <+0x002a> 0f 2c cmp r4, #15
0x80192fc <+0x002c> 45 ea 05 45 orr.w r5, r5, r5, lsl #16
0xffffff9 的反汇编:
0xfffffff7 00 00 movs r0, r0
0xfffffff9 00 00 movs r0, r0
0xfffffffb 00 00 movs r0, r0
我们在哪里可以找到这个异常的来源?
我们在 STM32F429II(Cortex-M4)上运行该软件。
请记住,对于 Cortex-M,链接寄存器值指示如何从异常中返回,而不是要返回的地址。 相关地址将在堆栈上(假设堆栈也没有失败)。
0xFFFFFFF1 返回处理程序模式。
异常返回从主堆栈中获取状态。 返回后执行使用MSP。
0xFFFFFFF9 返回线程模式。
异常返回从主堆栈中获取状态。 返回后执行使用MSP。
0xFFFFFFFD 返回线程模式。
异常返回从进程堆栈中获取状态。 返回后执行使用PSP。
Cortex-M 也永远无法从“本地外设”内存空间执行代码。
@鲁迪! 我希望你已经解决了这个问题。 我刚刚遇到了同样的问题,想分享我的经验。
MCU 从orr.w指令变为 HardFault 的事实并不意味着您的问题出在指令本身。 我使用 HFSR 寄存器(由@starblue 提到)来查找它发生变化的时刻。 如果您使用 Eclipse - 只需添加内存观察点或
(uint32_t)*((uint32_t *) 0xE000ED2C)
到表达式并找到值变得不等于零的那一行。
在我的情况下,它与空指针值分配一致。 在跳转到 Hardfault 处理程序之前是 15 条装配线。 在您的情况下,它甚至可能在其他线程中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.