Cross compiling - Error: selected processor does not support `fmrx r3,fpexc' in ARM mode - Beaglebone

Cross compiling - Error: selected processor does not support `fmrx r3,fpexc' in ARM mode - Beaglebone

我正在尝试交叉编译一个文件以闪存到 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 交叉编译器,它工作得很好

大多数 Linaro 工具链默认配置为 ARMv7 hard-float(当然是 Linux 的,我不太确定裸机的)。查看由 Arch 打包的 arm-none-eabi 工具链的配置,我推测它只是使用 GCC 默认值来处理类似的东西,这意味着像 ARMv4t 这样的东西,而且至关重要的是,soft-float ABI。

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

默认情况下未配置时,您需要显式 select 暗示实际硬件 FPU 的浮点 ABI,即 -mfloat-abi=hard(或 -mfloat-abi=softfp,但实际上没有使用它的理由,除非你需要 link 反对其他软浮动代码)。

-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 You can get the flags used for your toolchain build with gcc -v as mentioned at: 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。