【问题标题】:STM32 Cortex-M4F FPU hardfaults on basic VLDR基本 VLDR 上的 STM32 Cortex-M4F FPU 硬故障
【发布时间】: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”,但这可能是调试器一旦出现硬故障就无法提取寄存器的怪癖。

【问题讨论】:

    标签: c assembly arm stm32 fpu


    【解决方案1】:

    好吧,我只是个笨蛋,并认为 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
    

    现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2021-07-23
      相关资源
      最近更新 更多