Cortex-M4和GCC - 浮点数行为

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 你能告诉我是否有什么明显的遗漏吗?

1
即使对新芯片的了解已经存在很长一段时间,gcc也需要一段时间才能赶上。因此,请使用最先进的gcc,如果它无法满足您的需求,那么要么为gcc做出贡献,要么等待或检查llvm/clang以查看它们是否已经赶上了(同样的问题,硬件和编译器之间存在延迟)。 - old_timer
你尝试过使用CodeRed编译器吗?它也是基于Gcc的。 - Felipe Lavratti
不,我必须使用这个编译器准备样本(虽然很好的想法,我应该尝试更新的版本,因为有一些新版本发布了)。 - Anja V.
1个回答

14

使用ARM提供的GNU工具链,您需要使用以下命令进行编译:

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

使用硬件浮点运算,请参考来自readme.txt文件的以下表格:

   架构选项使用情况
--------------------------------------------------------------------
| ARM Core | Command Line Options                       | multilib |
|----------|--------------------------------------------|----------|
|Cortex-M0+| -mthumb -mcpu=cortex-m0plus                | armv6-m  |
|Cortex-M0 | -mthumb -mcpu=cortex-m0                    |          |
|Cortex-M1 | -mthumb -mcpu=cortex-m1                    |          |
|          |--------------------------------------------|          |
|          | -mthumb -march=armv6-m                     |          |
|----------|--------------------------------------------|----------|
|Cortex-M3 | -mthumb -mcpu=cortex-m3                    | armv7-m  |
|          |--------------------------------------------|          |
|          | -mthumb -march=armv7-m                     |          |
|----------|--------------------------------------------|----------|
|Cortex-M4 | -mthumb -mcpu=cortex-m4                    | armv7e-m |
|(无FP)    |--------------------------------------------|          |
|          | -mthumb -march=armv7e-m                    |          |
|----------|--------------------------------------------|----------|
|Cortex-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                          |          |
|----------|--------------------------------------------|----------|
|Cortex-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 |                                            | /thumb   |
|Cortex-R7 |                                            |      |
|(无FP)    |                                            |          |
|----------|--------------------------------------------|----------|
|Cortex-R4 | [-mthumb] -march=armv7-r -mfloat-abi=softfp| armv7-ar |
|Cortex-R5 | -mfpu=vfpv3-d16                            | /thumb   |
|Cortex-R7 |                                            | /softfp  |
|(软FP)   |                                            |          |
|----------|--------------------------------------------|----------|
|Cortex-R4 | [-mthumb] -march=armv7-r -mfloat-abi=hard  | armv7-ar |
|Cortex-R5 | -mfpu=vfpv3-d16                            | /thumb   |
|Cortex-R7 |                                            | /fpu     |
|(硬FP)   |                                            |          |
|----------|--------------------------------------------|----------|
|Cortex-A* | [-mthumb] -march=armv7-a                   | armv7-ar |
|(无FP)    |                                            | /thumb   |
|----------|--------------------------------------------|----------|
|Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=softfp| armv7-ar |
|(软FP)   | -mfpu=vfpv3-d16                            | /thumb   |
|          |                                            | /softfp  |
|----------|--------------------------------------------|----------|
|Cortex-A* | [-mthumb] -march=armv7-a -mfloat-abi=hard  | armv7-ar |
|(硬FP)   | -mfpu=vfpv3-d16                            | /thumb   |
|          |                                            | /fpu     |
--------------------------------------------------------------------

无论您从何处获得gcc工具链,都应该真的阅读附带的README文件。


非常清晰的答案。也许值得注意的是,并非所有的Cortex-M4芯片都具有硬件FP(尽管LPC4357具有)。 - Clifford
你实际上不需要-mfloat-abi=hard来使用FPU。mfloat-abi参数只是控制用于浮点值的调用约定。 - Venemo
对于Cortex-M4,有没有关闭双精度的方法?使用“-mfpu = fpv4-sp-d16”来指定有16个可用的双精度寄存器,对吗?这不正确,对吧?我遇到的问题是,在Cortex-M4上使用varargs时,浮点数仍会被提升为双精度,这会导致链接器错误。有没有一组不同的标志来关闭它? - TheHebrewHammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接