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 を初期化するコードの一部を削除すると、正常に動作します。

これらのエラーが発生するのはなぜですか?

Makefile

[...]
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 hard-float 用に構成されています (確かに Linux のものですが、ベアメタルのものについてはあまり確信が持てません)。Arch によってパッケージ化された arm-none-eabi ツールチェーンの構成を見ると、GCC のデフォルトをそのようなものに使用しているだけだと推測できます。これは、ARMv4t のようなもの、そして決定的にソフト フロート ABI を意味します。

このオプションは、どの浮動小数点命令を使用できるかという点でコード生成を制御しますが、浮動小数点エミュレーションではなく、ハードウェア FPU でのみ-mfpu意味のあることを実行できるようにするかどうかを制御するのは明らかに float ABI です。.

デフォルトで構成されていない場合は、実際のハードウェア FPU を意味する浮動小数点 ABI を明示的に選択する必要があります-mfloat-abi=hard(または-mfloat-abi=softfp、他のソフト フロート コードとリンクする必要がない限り、それを使用する理由はありません)。

于 2016-12-13T22:39:05.027 に答える