【发布时间】:2020-11-12 16:18:57
【问题描述】:
是的,我的特定 MCU 中有一个 FPU。
代码使用-mfloat-abi=soft 标志编译,否则浮点变量永远不会传递给R0
FPU 通过SCB->CPACR |= ((3UL << (10 * 2)) | (3UL << (11 * 2))); 启用
汇编函数;
sqrt_func:
VLDR.32 S0, [R0] <-- hardfault
VSQRT.F32 S0, S0
VSTR.32 S0, [R0]
BX LR
调用该函数的C代码;
extern float sqrt_func(float s);
float x = sqrt_func(1000000.0f);
但单步执行后,MCU 在VLDR.32 S0, [R0] 出现硬故障并显示 CFSR
CFSR
->BFARVALID
->PRECISERR
我看到浮点数被正确传递,因为那是它出现硬故障时的十六进制值;
R0
->0x49742400
S0 永远不会加载任何内容。
我不明白为什么这是硬故障,有人有什么想法吗?我正在尝试使用 FPU 手动计算平方根。
还有什么奇怪的是 d13-d15 和 s0-s31 寄存器显示“0xx-2”,但这可能是调试器一旦出现硬故障就无法提取寄存器的怪癖。
【问题讨论】: