我试图将文件交叉编译为闪存到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交叉编译器,它工作得很好
答案 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上进行了测试。