交叉编译 - 错误:所选处理器不支持`fmrx r3,fpexc'在ARM模式下 - Beaglebone

时间:2016-12-13 22:11:13

标签: gcc arm cross-compiling beagleboneblack newlib

我试图将文件交叉编译为闪存到Beaglebone Black。 一切正常,但如果我尝试使用

启用FPU
#define set_en_bit_in_fpexc() do { \
    int dummy; \
    __asm__ __volatile__ ("fmrx %0,fpexc\n\t" \
                         "orr  %0,%0,#0x40000000\n\t" \
                         "fmxr fpexc,%0" : "=r" (dummy) : :); \
} while (0)

我收到以下错误

Error: selected processor does not support `fmrx r3,fpexc' in ARM mode
Error: selected processor does not support `fmxr fpexc,r3' in ARM mode

我也试过了thumb mode,但我得到了同样的错误。 当然,如果我删除初始化FPU的部分代码,它可以正常工作。

为什么我会收到这些错误?

生成文件

[...]
CROSSPATH?=/usr/bin
CROSSPFX=$(CROSSPATH)/arm-none-eabi-
CC=$(CROSSPFX)gcc
AS=$(CROSSPFX)as
LD=$(CROSSPFX)ld
NM=$(CROSSPFX)nm
OBJCOPY=$(CROSSPFX)objcopy
OBJDUMP=$(CROSSPFX)objdump
CFLAGS=-Wall -Wextra -O2 -ffreestanding
ARCHFLAGS=-mcpu=cortex-a8 -march=armv7-a -mfpu=neon
CCARCHFLAGS=$(ARCHFLAGS) -marm
[...]

我在Arch,内核4.8.1

P.S。我的教授使用 linaro交叉编译器,它工作得很好

2 个答案:

答案 0 :(得分:1)

默认情况下,大多数Linaro工具链都配置为ARMv7硬浮动(当然是Linux的,我对裸机的不太确定)。看看Arch打包的arm-none-eabi工具链的配置,我推测它只是使用GCC默认值来表示像ARMv4t这样的东西,最重要的是,软浮动ABI。

虽然-mfpu选项根据可能使用的浮点指令控制代码生成,但显然它是浮动ABI,它控制它是否会让你做的事情只是 在硬件FPU上有意义,而不是在浮点仿真下。

默认情况下未配置时,您需要显式选择隐含实际硬件FPU的浮点ABI,即-mfloat-abi=hard(或-mfloat-abi=softfp,但除非您确实没有理由使用它需要链接其他软浮动代码。)

答案 1 :(得分:0)

-mfpu=vfpv3-d16 -mfloat-abi=hard

为了给出更直接的解决方案,我必须添加-mfpu=vfpv3-d16

测试代码a.S

fmrx r2, fpscr

工作命令:

sudo apt-get install binutils-arm-linux-gnueabihf
arm-linux-gnueabihf-as -mfpu=vfpv3-d16 -mfloat-abi=hard a.S

请注意,-mfloat-abi=hard在此特定版本的arm-linux-gnueabihf-as上默认启用,可以省略。

float-abi的默认值可能取决于-msoft-float-mhard-float在GCC构建时通过以下方式控制:

./configure --with-float=soft
如在https://gcc.gnu.org/install/configure.html中所述的

,您可以使用gcc -v获取用于工具链构建的标志,如在What configure options were used when building gcc / libstdc++?中所述,但是如果没有给出,我无法轻易确定其默认值。

您可能还对-mfloat-abi=softfp感兴趣,它可以为可执行文件生成硬浮点,但生成软函数调用:ARM compilation error, VFP registered used by executable, not object file

可以在以下位置找到-mfpu=的可能值:https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/ARM-Options.html#ARM-Options

还请注意,FMRX是VMRS的UAL前置语法,是较新的推荐语法,另请参见:Are ARM instructuons SWI and SVC exactly same thing?

在Ubuntu 16.04,arm-linux-gnueabihf-as 2.26.1上进行了测试。