【发布时间】: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
在这种情况下,二进制文件的大小比前两个示例要小得多,而且我查看了反汇编文件,发现命令如下:vldr、vmul 等。但是这段代码不起作用,当我尝试执行任何 FPU 汇编命令时,程序会跳转到 HardFault_Handler。
所以我的问题是:
- 为什么扩展“+fp.dp”和“+nofp”对输出二进制没有影响?
- 为什么我的代码在尝试执行任何 FPU 命令时会崩溃?
我会很高兴您的任何想法、问题和甚至解决方案:)
【问题讨论】: