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