首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >碱性STM32上的STM32 Cortex-M4FFPU硬故障

碱性STM32上的STM32 Cortex-M4FFPU硬故障
EN

Stack Overflow用户
提问于 2020-07-23 02:09:26
回答 1查看 274关注 0票数 0

是的,我的专用单片机有一个FPU。

代码是用-mfloat-abi=soft标志编译的,否则浮点变量永远不会传递给R0。

FPU通过SCB->CPACR |= ((3UL << (10 * 2)) | (3UL << (11 * 2)));启用。

装配功能;

代码语言:javascript
运行
复制
sqrt_func:
    VLDR.32 S0, [R0] <-- hardfault
    VSQRT.F32 S0, S0
    VSTR.32 S0, [R0]
    BX LR

C代码调用所述功能;

代码语言:javascript
运行
复制
extern float sqrt_func(float s);
float x = sqrt_func(1000000.0f);

但在通过后,VLDR.32 S0, [R0]上的MCU硬故障显示了CFSR。

代码语言:javascript
运行
复制
CFSR
->BFARVALID
->PRECISERR

我看到浮子被正确地传递了,因为这是它的十六进制值,当它硬故障的时候;

代码语言:javascript
运行
复制
R0
->0x49742400

S0从来没有被装载过任何东西。

我不知道为什么这是很难的错误,有人有什么想法吗?我正在尝试使用FPU手动计算平方根。

另外,奇怪的是d13-d15和s0-s31寄存器显示"0xx-2“,但这可能是调试器一旦出现故障就无法提取寄存器的怪癖。

EN

Stack Overflow用户

回答已采纳

发布于 2020-07-23 02:35:45

好吧,我只是个笨蛋,认为VLDR和VSTR由于某些原因而不同,但它们和LDR和STR是一样的。浮点数的值被传递给R0,但是VLDR试图在该地址(0x49742400,也就是我的十六进制浮点数)上加载值,这要么是无效地址,要么是某种类型的内存冲突。

相反,您必须使用VMOV.32复制注册内容;

代码语言:javascript
运行
复制
sqrt_func:
    VMOV.32 S0, R0
    VSQRT.F32 S0, S0
    VMOV.32 R0, S0
    BX LR

现在起作用了。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63045790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档