c -调试ARM Cortex-M0+硬故障(使用CMSIS DSP库)



我在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的地址。

我不明白为什么我得到这个硬故障。我该怎么办?

谢谢!

让我们通过查看这个页面来看看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可能被声明为float32_t pOut = bar;,因为作为指针参数,它正在寻找地址

如果Cortex-M0故障机制与Cortex-M3/4/7故障机制相同,那么下面的页面提供了如何解码故障堆栈的详细信息,给出了故障指令的地址,以及当时的寄存器值。http://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html

最新更新