基本 VLDR 上的 STM32 Cortex-M4F FPU 硬故障
STM32 Cortex-M4F FPU hardfaults on basic VLDR
是的,我的特定 MCU 中有一个 FPU。
代码使用 -mfloat-abi=soft
标志编译,否则 float 变量永远不会传递给 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”,但这可能是调试器一旦出现硬故障就无法提取寄存器的怪癖。
好吧,我只是个笨蛋,我认为 VLDR 和 VSTR 出于某种原因运作方式不同,但它们与 LDR 和 STR 相同。浮点数的值被传递给 R0,但 VLDR 试图加载该地址的值(0x49742400,这是我的十六进制浮点值),这要么是无效地址,要么是某种内存违规。
相反,您必须使用 VMOV.32
来复制寄存器内容;
sqrt_func:
VMOV.32 S0, R0
VSQRT.F32 S0, S0
VMOV.32 R0, S0
BX LR
现在可以使用了。
是的,我的特定 MCU 中有一个 FPU。
代码使用 -mfloat-abi=soft
标志编译,否则 float 变量永远不会传递给 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”,但这可能是调试器一旦出现硬故障就无法提取寄存器的怪癖。
好吧,我只是个笨蛋,我认为 VLDR 和 VSTR 出于某种原因运作方式不同,但它们与 LDR 和 STR 相同。浮点数的值被传递给 R0,但 VLDR 试图加载该地址的值(0x49742400,这是我的十六进制浮点值),这要么是无效地址,要么是某种内存违规。
相反,您必须使用 VMOV.32
来复制寄存器内容;
sqrt_func:
VMOV.32 S0, R0
VSQRT.F32 S0, S0
VMOV.32 R0, S0
BX LR
现在可以使用了。