8

我正在尝试交叉编译一个文件以闪存到 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

PS 我的教授使用linaro 交叉编译器,它工作得很好

4

2 回答 2

4

大多数 Linaro 工具链默认配置为 ARMv7 硬浮点(当然是 Linux 的,我不太确定裸机的)。查看 Arch 打包的 arm-none-eabi 工具链的配置,我推测它只是使用 GCC 默认值来处理类似的事情,这意味着类似于 ARMv4t 的东西,以及至关重要的软浮动 ABI。

虽然该-mfpu选项根据可以使用哪些浮点指令来控制代码生成,但显然是浮点 ABI 控制它是否允许您执行仅在硬件 FPU 上才有意义的事情,而不是在浮点仿真下.

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

于 2016-12-13T22:39:05.027 回答
1

-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取决于在 GCC 构建时控制的-msoft-floatvs :-mhard-float

./configure --with-float=soft

如记录在:https://gcc.gnu.org/install/configure.html您可以获取用于工具链构建的标志,gcc -v如:构建 gcc / libstdc++ 时使用了哪些配置选项?但是,如果没有给出,我无法轻易确定它的默认值。

您可能还对-mfloat-abi=softfp哪些可以为可执行文件生成硬浮点数但生成软函数调用感兴趣:ARM 编译错误,VFP 注册使用的可执行文件,而不是目标文件

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

另请注意,FMRX 是 VMRS 的预 UAL 语法,它是较新的推荐语法,另请参阅:ARM 指令 SWI 和 SVC 是否完全相同?

在 Ubuntu arm-linux-gnueabihf-as16.04、2.26.1 上测试。

于 2018-10-18T13:58:17.047 回答