是的,我的专用单片机有一个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);
但在通过后,VLDR.32 S0, [R0]
上的MCU硬故障显示了CFSR。
CFSR
->BFARVALID
->PRECISERR
我看到浮子被正确地传递了,因为这是它的十六进制值,当它硬故障的时候;
R0
->0x49742400
S0
从来没有被装载过任何东西。
我不知道为什么这是很难的错误,有人有什么想法吗?我正在尝试使用FPU手动计算平方根。
另外,奇怪的是d13-d15和s0-s31寄存器显示"0xx-2“,但这可能是调试器一旦出现故障就无法提取寄存器的怪癖。
发布于 2020-07-23 02:35:45
好吧,我只是个笨蛋,认为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
现在起作用了。
https://stackoverflow.com/questions/63045790
复制相似问题