5

如果我为 Cortex-M4 (LPC4357) 编译 GCC 项目并使用 -mcpu=cortex-m4 开关浮点不起作用(调用 blx __addsf3,最终分支到 stmia 命令,这会导致错误中断,可能是由于错误的值在寄存器中)。如果我使用 -mcpu=cortex-m3 进行编译,它会调用 bl __addsf3,它有不同的来源并且可以工作。

我想我可能必须修复其他开关才能使浮点数与 -mcpu=cortex-m4 一起工作......我尝试了几件事,但这真的很奇怪。

相关的编译器和链接器开关:

编译器:-mthumb -mcpu=cortex-m4 -std=c99 -c -g -D DEBUG -D gcc

链接器:-nostartfiles -nostdlib -nodefaultlibs -fno-exceptions -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -O0 -lgcc -lc

你能告诉我这里是否遗漏了一些明显的东西吗?

4

1 回答 1

14

使用 ARM 提供的GNU Tools for ARM Embedded Processors工具链,您需要编译:

 -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16

使用硬件浮点。请参阅readme.txt文件中的下表:

架构选项使用
-------------------------------------------------- ------------------
| ARM 内核 | 命令行选项 | 多库 |
|---------|-------------------------------------- ----|----------|
|皮质-M0+| -mthumb -mcpu=cortex-m0plus | armv6-m |
|皮质-M0 | -mthumb -mcpu=皮质-m0 | |
|皮质-M1 | -mthumb -mcpu=皮质-m1 | |
| |--------------------------------------------| |
| | -mthumb -march=armv6-m | |
|---------|-------------------------------------- ----|----------|
|皮质-M3 | -mthumb -mcpu=cortex-m3 | armv7-m |
| |--------------------------------------------| |
| | -mthumb -march=armv7-m | |
|---------|-------------------------------------- ----|----------|
|皮质-M4 | -mthumb -mcpu=cortex-m4 | armv7e-m |
|(无 FP) |-------------------------------------------- | |
| | -mthumb -march=armv7e-m | |
|---------|-------------------------------------- ----|----------|
|皮质-M4 | -mthumb -mcpu=cortex-m4 -mfloat-abi=softfp | armv7e-m |
|(软FP) | -mfpu=fpv4-sp-d16 | /softfp |
| |--------------------------------------------| |
| | -mthumb -march=armv7e-m -mfloat-abi=softfp | |
| | -mfpu=fpv4-sp-d16 | |
|---------|-------------------------------------- ----|----------|
|皮质-M4 | -mthumb -mcpu=cortex-m4 -mfloat-abi=hard | armv7e-m |
|(硬 FP) | -mfpu=fpv4-sp-d16 | /fpu |
| |--------------------------------------------| |
| | -mthumb -march=armv7e-m -mfloat-abi=hard | |
| | -mfpu=fpv4-sp-d16 | |
|---------|-------------------------------------- ----|----------|
|Cortex-R4 | [-mthumb] -march=armv7-r | armv7-ar |
|Cortex-R5 | | /大拇指 |
|Cortex-R7 | | |
|(无FP) | | |
|---------|-------------------------------------- ----|----------|
|Cortex-R4 | [-mthumb] -march=armv7-r -mfloat-abi=softfp| armv7-ar |
|Cortex-R5 | -mfpu=vfpv3-d16 | /大拇指 |
|Cortex-R7 | | /softfp |
|(软FP) | | |
|---------|-------------------------------------- ----|----------|
|Cortex-R4 | [-mthumb] -march=armv7-r -mfloat-abi=hard | armv7-ar |
|Cortex-R5 | -mfpu=vfpv3-d16 | /大拇指 |
|Cortex-R7 | | /fpu |
|(硬 FP) | | |
|---------|-------------------------------------- ----|----------|
|皮质-A* | [-mthumb] -march=armv7-a | armv7-ar |
|(无FP) | | /大拇指 |
|---------|-------------------------------------- ----|----------|
|皮质-A* | [-mthumb] -march=armv7-a -mfloat-abi=softfp| armv7-ar |
|(软FP) | -mfpu=vfpv3-d16 | /大拇指 |
| | | /softfp |
|---------|-------------------------------------- ----|----------|
|皮质-A* | [-mthumb] -march=armv7-a -mfloat-abi=hard | armv7-ar |
|(硬 FP) | -mfpu=vfpv3-d16 | /大拇指 |
| | | /fpu |
-------------------------------------------------- ------------------

无论您从哪里获得 gcc 工具链,您都应该真正阅读 README 文件。

于 2014-09-08T15:42:08.340 回答