STM32 Cortex-M4F FPU hardfaults on basic VLDR
是的,我的特定 MCU 中有一个 FPU。
代码使用
FPU 通过
启用
汇编函数;
1
2 3 4 5 |
sqrt_func:
VLDR.32 S0, [R0] <– hardfault VSQRT.F32 S0, S0 VSTR.32 S0, [R0] BX LR |
调用该函数的C代码;
1
2 |
extern float sqrt_func(float s);
float x = sqrt_func(1000000.0f); |
但单步执行后,MCU 在
1
2 3 |
CFSR
->BFARVALID ->PRECISERR |
我看到浮点数被正确传递,因为那是它出现硬故障时的十六进制值;
1
2 |
R0
->0x49742400 |
我不明白为什么这是硬故障,有人有什么想法吗?我正在尝试使用 FPU 手动计算平方根。
还有什么奇怪的是 d13-d15 和 s0-s31 寄存器显示”0xx-2″,但这可能是调试器在硬故障后??无法提取寄存器的怪癖。
好吧,我只是个笨蛋,认为 VLDR 和 VSTR 出于某种原因操作不同,但它们与 LDR 和 STR 相同。浮点值被传递给 R0,但 VLDR 试图加载该地址的值(0x49742400,这是我的十六进制浮点值),这要么是无效地址,要么是某种内存违规。
您必须使用
1
2 3 4 5 |
sqrt_func:
VMOV.32 S0, R0 VSQRT.F32 S0, S0 VMOV.32 R0, S0 BX LR |
现在它可以工作了。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269299.html