首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FPU扩展“+FPU 5”和“+fp.dp”对输出二进制(STM32F767ZIT ARM Cortex-M7)没有影响。

FPU扩展“+FPU 5”和“+fp.dp”对输出二进制(STM32F767ZIT ARM Cortex-M7)没有影响。
EN

Stack Overflow用户
提问于 2020-11-10 19:01:09
回答 1查看 361关注 0票数 0

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

我使用Linux上的VSCode (Ubuntu20.04.1)为STM32构建和调试项目。当我开始使用STM32F767ZIT时,我发现它有硬件单元来加速浮点数的操作。

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

我使用Arm嵌入式工具链(15:9-2019-Q4-0ubuntu1) 9.2.1 20191025 (发行版)arm/arm-9分支版本277599)构建源代码并创建*.elf文件。在编译对象时,我使用的是next命令:

代码语言:javascript
复制
arm-none-eabi-gcc "foo.c" -c -march=armv7e-m+fp.dp -mtune=cortex-m7 -g3 -mthumb -std=gnu11 -o "foo.o"

在链接所有对象时:

代码语言:javascript
复制
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浮点指令。我的主要功能仅用于测试,如下所示:

代码语言:javascript
复制
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扩展时,编译器应该使用额外的库来处理浮点数操作,所以二进制文件的大小应该更大。另外,我还测试了生产率,这两种情况都是一样的。

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

代码语言:javascript
复制
-mfloat-abi=hard -mfpu=fpv5-d16

在这种情况下,二进制文件的大小要比前两个示例小得多,而且我还查看了解压缩文件,并找到了命令,如: vldr、vmul等。但是,当我尝试执行任何FPU程序集命令时,程序跳转到HardFault_Handler时,这段代码不起作用。

所以我的问题是:

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

我会很高兴你的任何想法,问题,甚至解决办法:)

EN

回答 1

Stack Overflow用户

发布于 2020-11-10 19:24:48

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

因为你需要先启用FPU。否则,它将产生高频,因为没有什么可以解释FPU指令。

代码语言:javascript
复制
SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2)));

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

因为您没有告诉编译器生成FPU指令。请记住,您将不得不链接到ABI硬FPU库以及。

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

忘记"+fp.dp“等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64775120

复制
相关文章

相似问题

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