我在Cortex-M0+上使用CMSIS的数字信号处理库。
一些函数,如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的地址。
我不明白为什么我会犯这个严重的错误。我该怎么办?
谢谢!

最佳答案

让我们通过looking at this page查看str调用的具体操作
你的str调用正在执行str r2,[r3,#0],它转换为(如果我没有弄错的话):
将r2存储在地址r3中,偏移量为0
查看这些寄存器值,您正试图将0x40000000放入位置0x0,偏移量为0,因此0x0仍然存在。这相当于一个分段错误,您试图访问对您不可用的内存,从而导致硬错误。
鉴于代码是如何生成的,我假设您给它一个错误的pOut指针。
确保您不是通过执行arm_sqrt_f32(float32_t foo, float32_t* pOut)来调用函数,您将希望通过执行arm_sqrt_f32(float32_t foo, float32_t &pOut)来调用它,其中pOut可能会被delcared为float32_t pOut = bar;,因为作为指针参数,它会查找地址

关于c - 在ARM Cortex-M0 +上调试硬故障(使用CMSIS DSP库),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31391328/

10-11 15:34