在 ARM Cortex-M0+ 上调试硬故障(使用 CMSIS DSP 库)
Debugging Hard Fault on ARM Cortex-M0+ (using CMSIS DSP library)
我在 Cortex-M0+ 上使用 CMSIS DSP 库。
某些函数(例如 sqrt 和 FFT)导致硬故障。
arm_sqrt_f32函数调用sqrtf:
arm_sqrt_f32(
float32_t in,
float32_t * pOut)
[...]
*pOut = sqrtf(in);
部分生成代码:
0x00003914: bl 0x49e8 <sqrtf>
0x00003918: adds r2, r0, #0
0x0000391a: ldr r3, [r7, #0]
0x0000391c: str r2, [r3, #0]
硬故障发生在地址 0x0000391c 的 str 指令上。在此行时,寄存器为:
$r1 0x0
$r2 0x40000000
$r3 0x0
$r4 0x0
$r5 0x200017fc
$r6 0x0
$r7 0x200017e0
$r8 0xfff7ffff
$r9 0xefbffffe
$r10 0xff7fffff
$r11 0x0
$r12 0x0
SP寄存器为0x200017e0,地址为0。
我不明白为什么我会遇到这个硬错误。我该怎么办?
谢谢!
如果Cortex-M0故障机制与Cortex-M3/4/7故障机制相同,那么下页提供了有关如何解码故障堆栈的详细信息,为您提供故障指令的地址,如以及当时的寄存器值。
http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html
让我们看看 looking at this page 你的 str 调用到底在做什么
您的 str 调用正在执行 str r2,[r3, #0] 转换为(如果我没记错的话):
store r2 in the address r3 offset by #0
查看这些寄存器值,您正试图将 0x40000000 放入偏移 0 的位置 0x0,所以 0x0 仍然是。这相当于一个分段错误,你正试图访问你不可用的内存,从而导致硬错误。
看到代码是如何生成的,我假设你给它一个错误的 pOut
指针。
确保您没有通过执行 arm_sqrt_f32(float32_t foo, float32_t* pOut)
来调用该函数,您需要通过执行 arm_sqrt_f32(float32_t foo, float32_t &pOut)
来调用它,其中 pOut 可能被指定为 float32_t pOut = bar;
因为,一个指针争论,它正在寻找一个地址
我在 Cortex-M0+ 上使用 CMSIS DSP 库。 某些函数(例如 sqrt 和 FFT)导致硬故障。
arm_sqrt_f32函数调用sqrtf:
arm_sqrt_f32(
float32_t in,
float32_t * pOut)
[...]
*pOut = sqrtf(in);
部分生成代码:
0x00003914: bl 0x49e8 <sqrtf>
0x00003918: adds r2, r0, #0
0x0000391a: ldr r3, [r7, #0]
0x0000391c: str r2, [r3, #0]
硬故障发生在地址 0x0000391c 的 str 指令上。在此行时,寄存器为:
$r1 0x0
$r2 0x40000000
$r3 0x0
$r4 0x0
$r5 0x200017fc
$r6 0x0
$r7 0x200017e0
$r8 0xfff7ffff
$r9 0xefbffffe
$r10 0xff7fffff
$r11 0x0
$r12 0x0
SP寄存器为0x200017e0,地址为0。
我不明白为什么我会遇到这个硬错误。我该怎么办?
谢谢!
如果Cortex-M0故障机制与Cortex-M3/4/7故障机制相同,那么下页提供了有关如何解码故障堆栈的详细信息,为您提供故障指令的地址,如以及当时的寄存器值。 http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html
让我们看看 looking at this page 你的 str 调用到底在做什么 您的 str 调用正在执行 str r2,[r3, #0] 转换为(如果我没记错的话):
store r2 in the address r3 offset by #0
查看这些寄存器值,您正试图将 0x40000000 放入偏移 0 的位置 0x0,所以 0x0 仍然是。这相当于一个分段错误,你正试图访问你不可用的内存,从而导致硬错误。
看到代码是如何生成的,我假设你给它一个错误的 pOut
指针。
确保您没有通过执行 arm_sqrt_f32(float32_t foo, float32_t* pOut)
来调用该函数,您需要通过执行 arm_sqrt_f32(float32_t foo, float32_t &pOut)
来调用它,其中 pOut 可能被指定为 float32_t pOut = bar;
因为,一个指针争论,它正在寻找一个地址