如果课文中有任何错误,我想提前道歉,因为我的英语还不是很好:)
我使用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命令:
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时,这段代码不起作用。
所以我的问题是:
我会很高兴你的任何想法,问题,甚至解决办法:)
发布于 2020-11-10 19:24:48
为什么我的代码在尝试执行任何FPU命令时崩溃?
因为你需要先启用FPU。否则,它将产生高频,因为没有什么可以解释FPU指令。
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“等。
https://stackoverflow.com/questions/64775120
复制相似问题