gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:35:09 26 4
gpt4 key购买 nike

我在 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。

我不明白为什么我会遇到这个硬错误。我该怎么办?

谢谢!

最佳答案

让我们通过 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; 因为作为指针参数,它正在寻找地址

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com