【问题标题】:FPU extension '+fpv5' and '+fp.dp' has no effect to the output binary (STM32F767ZIT ARM Cortex-M7)FPU 扩展 '+fpv5' 和 '+fp.dp' 对输出二进制文件没有影响(STM32F767ZIT ARM Cortex-M7)
【发布时间】:2020-11-10 19:01:09
【问题描述】:

如果文字有任何错误,我想提前道歉,因为我的英语还不是很好:)

我在 Linux (Ubuntu 20.04.1) 上使用 VSCode 为 STM32 构建和调试项目。当我开始使用 STM32F767ZIT 时,我发现它有硬件单元来加速浮点数的运算。

数据表:“Cortex®-M7 内核具有支持 Arm 双精度和单精度数据处理指令和数据类型的浮点单元 (FPU)”。

我正在使用 Arm Embedded Toolchain ((15:9-2019-q4-0ubuntu1) 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599]) 构建源代码并创建 *.elf文件。当我编译对象时,我正在使用下一个命令:

arm-none-eabi-gcc "foo.c" -c -march=armv7e-m+fp.dp -mtune=cortex-m7 -g3 -mthumb -std=gnu11 -o "foo.o"

当链接所有对象时:

arm-none-eabi-gcc -march=armv7e-m+fp.dp -mtune=cortex-m7 -g3 -mthumb -T"flash.ld" -o "target.elf" "objects.o"

如您所见,我使用“+fp.dp”扩展名,启用单精度和双精度 FPv5 浮点指令。我的主要功能仅用于测试,如下所示:

int main()
{
    double var = 1.1;
    var *= 1.2;
    var += 1.3;
    if (var > 1.4) {
        var /= 1.5;
        var -= 1.6;
    }
}

所以当我构建项目时,我得到了下一个结果: text:3412 data:1084 bss:1568 dec:6064 hex:17b0

但是,当我禁用 FPU 扩展并使用 -march=armv7e-m+nofp 时,输出二进制文件的大小相同。我认为当我禁用 FPU 扩展时,编译器应该使用额外的库来处理浮点数运算,所以我的二进制文件的大小应该更大。另外,我测试了生产力,这两种情况都是一样的。

另外,我尝试使用其他参数:

-mfloat-abi=hard -mfpu=fpv5-d16

在这种情况下,二进制文件的大小比前两个示例要小得多,而且我查看了反汇编文件,发现命令如下:vldrvmul 等。但是这段代码不起作用,当我尝试执行任何 FPU 汇编命令时,程序会跳转到 HardFault_Handler

所以我的问题是:

  1. 为什么扩展“+fp.dp”和“+nofp”对输出二进制没有影响?
  2. 为什么我的代码在尝试执行任何 FPU 命令时会崩溃?

我会很高兴您的任何想法、问题和甚至解决方案:)

【问题讨论】:

    标签: c arm stm32 fpu


    【解决方案1】:

    为什么我的代码在尝试执行任何 FPU 命令时会崩溃?

    因为您需要先启用 FPU。否则,它将生成 HF,因为没有任何东西可以解释 FPU 指令。

    SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2)));
    

    为什么扩展“+fp.dp”和“+nofp”对输出二进制没有影响?

    因为您没有告诉编译器生成 FPU 指令。请记住,您还必须链接 ABI HARD FPU 库。

    使用选项:-mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16

    忘记“+fp.dp”等。

    【讨论】:

    • 谢谢!这真的是因为我没有先启用 FPU。顺便说一句,我还发现 CMSIS 在 SystemInit 函数中启用了 FPU,但我在没有它的情况下进行了测试。
    • SystemInit 是 HAL 而非 CMSIS 的一部分
    • 我的意思是我在“STM32CubeF7-master/Drivers/CMSIS/Device/ST/STM32F7xx/Source/Templates/system_stm32f7xx.c”文件中找到了这个函数。它是 Cube 数据包的一部分,但放在 CMSIS 驱动程序文件夹中 :)
    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2022-09-24
    • 2015-11-20
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多