2013-02-19 7 views
9

ツールチェインのgccオプションを把握しようとしています。開発ボード用に設定しています。 FreescaleのiMX6qクワッドプロセッサをベースにしたSaber-Liteです。フリースケールのiMX6q ARMプロセッサのgccオプション

iMX6は基本的にコプロセッサーvfpv3とネオン、そしてベクトルグラフィックス、2D、さらには3Dエンジンを搭載したcortex-a9プロセッサーです。

しかし、gccで有効にできるオプションを有効にする方法については、リリースノートと使用ガイドのドキュメントであまり明確ではありません。

実際に私がプレイできるオプションは次のとおりです。

-march= armv7-a    - ok this one is pretty obvious. 
-mfpu= vfpv3/neon    - i can use only the vfpv3 co-processor, or both (respectively, depends on option) 
-mfloat-abi=softfp/soft/hard - I guess I can choose hard here, as there is hardware for fp operations 
-mcpu=cortex-a9    - is it option even necessary? it is not clear if it just an alias for -march or something else. 

有効にする必要があるその他のオプションはありますか? はなぜツールチェーンは、Linuxカーネル/ ubootを構築するために、デフォルトのオプションとして持っていない/次をパッケージ化:

-march= armv7-a -mfpu= vfpv3 -mfloat-abi=softfp 

あなたの助け

+4

あなた-mfloat-ABI ABIがシステム上で使用されている方と一致する必要があります。 softfpも浮動小数点ハードウェアを使用しますが、呼び出し規約が異なります。 "readelf -A/bin/ls"(例えば)で確認できます。 "Tag_ABI_VFP_args:VFPレジスタ"はハードを意味します。 – unixsmurf

+0

非常に便利です、ありがとうございます! – nass

+0

(もちろん、システムのネイティブgccを使用してターゲットシステムでネイティブにコンパイルしている場合は、正しいABIがコンパイラのデフォルトになり、省略することができます) – unixsmurf

答えて

6

使用-mthumb -O3 -march=armv7-a -mcpu=cortex-a9 -mtune=cortex-a9 -mfpu=neon -mvectorize-with-neon-quad -mfloat-abi=softfpいただきありがとうございます。 NEONは非正規化数をサポートしていないため、デフォルトでコンパイラはNEONを使用して浮動小数点演算をベクトル化しません。幾分精度が落ちても問題がなければ、-ffast-mathスイッチを追加することでgccに浮動小数点用のNEONを使用させることができます。

+2

ねえ、もう少し詳しく説明してください。なぜ私はsoftfpを使用するべきですか?また、-O3は、Linuxカーネルのためにあまりにも激しい最適化です。いいえ?私は、Uブート、カーネル、パッケージをコンパイルしようとする悪夢を抱く危険があるということです。いいえ?残りのオプションについてありがとうございます – nass

+2

softfpとhardの違いは、浮動小数点パラメータがどのように渡され、使用するLinuxディストリビューションに依存するかです。コンパイラのデフォルトはsoftfpなので、Linuxディストリビューションは浮動小数点パラメータを整数レジスタに渡します(ただし、FP演算にはまだハードウェアFPUを使用できます)。 LinuxカーネルまたはU-bootだけをコンパイルする場合は、コンパイラのデフォルトを変更しないでください。上記のオプションはユーザー空間プログラムをコンパイルするためのものです。 –

1

私はすべてに答えられませんが、 '--softfp'はFPUを使用することを意味しますが、FPUを使用しないコードとの互換性を維持することを意味します。

Slightly outdated ARM FP document

関連する問題