ign*_*gng 8 gcc arm cross-compiling newlib beagleboneblack
我正在尝试交叉编译一个文件以闪入 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)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Error: selected processor does not support `fmrx r3,fpexc' in ARM mode
Error: selected processor does not support `fmxr fpexc,r3' in ARM mode
Run Code Online (Sandbox Code Playgroud)
我也尝试过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
[...]
Run Code Online (Sandbox Code Playgroud)
我在 Arch,内核 4.8.1
PS 我的教授使用linaro 交叉编译器,它工作得很好
大多数 Linaro 工具链默认配置为 ARMv7 硬浮点(当然是 Linux 工具链,我对裸机工具链不太确定)。看看 Arch 打包的 arm-none-eabi 工具链的配置,我推测它只是使用 GCC 默认值来完成类似的事情,这意味着 ARMv4t 之类的东西,以及至关重要的软浮点 ABI。
虽然该-mfpu选项根据可以使用哪些浮点指令来控制代码生成,但显然是浮点 ABI 控制着是否让您执行仅在硬件 FPU 上有意义的操作,而不是在浮点仿真下才有意义。
当默认情况下未配置时,您需要显式选择一个暗示实际硬件 FPU 的浮点 ABI,即-mfloat-abi=hard(或-mfloat-abi=softfp,但实际上没有理由使用它,除非您需要链接其他软浮点代码)。
| 归档时间: |
|
| 查看次数: |
7276 次 |
| 最近记录: |