クロスツールチェーンでCコードをコンパイルすると、リンカーは、実行可能ファイルはハードフロートを使用しているが、libcはソフトフロートを使用しているという警告のページを印刷します。違いは何ですか?
ハードフロートは、オンチップの浮動小数点ユニットを使用します。ソフトフロートは、ソフトウェアの1つをエミュレートします。違いは速度です。チップがFPUを持っているか持っていないので、同じターゲットアーキテクチャで両方が使用されているのを見るのは奇妙です。 -msoft-floatを使用すると、GCCでソフト浮動小数点を有効にできます。使用する場合は、ハードウェア浮動小数点を使用するようにlibcを再コンパイルすることをお勧めします。
浮動小数点演算を行うには3つの方法があります。
厳密に言えば、これらの答えはすべて間違っているようです。
クロスツールチェーンを使用してCコードをコンパイルすると、リンカーは実行可能ファイルがハードフロートを使用しているが、libcはソフトフロートを使用しているという警告のページを印刷します。違いは何ですか?
Debian VFP wiki には、-mfloat-abi
の3つの選択肢に関する情報があります。
soft
-これは純粋なソフトウェアですsoftfp
-これはハードウェアFPUをサポートしますが、[〜#〜] abi [〜#〜]はソフト互換性があります。hard
-ABIはfloatまたは[〜#〜] vfp [〜#〜]レジスタを使用します。リンカ(ローダ)エラーは、整数レジスタに浮動小数点値を渡す共有ライブラリがあるためです。 -mfpu=vfp
などでコードをコンパイルすることはできますが、-mfloat-abi=softfp
を使用して、libcがfloatを必要とする場合は、ある方法で渡されるようにしてください。ライブラリは理解しています。
Linuxカーネルは、VFP命令のエミュレーションをサポートできます。明らかに、この場合は-mfpu=none
を使用してコンパイルし、Linuxカーネルエミュレーションに依存する代わりに、コンパイルでコードを直接生成する方が良いでしょう。ただし、OPのエラーが実際にこの問題に関連しているとは思わない。これは別個であり、-mfloat-abi
とともに処理する必要があります。
ArmV5 CPUを備えたArmv5共有ライブラリ は、これとは反対です。 libcはハードフロートでしたが、アプリケーションはsoftのみでした。この問題を回避するにはいくつかの方法がありますが、正しいオプションで再コンパイルするのが常に最も簡単です。
もう1つの問題は、コンテキストスイッチのレジスタを保存/復元するために、LinuxカーネルがVFPタスク(またはARM浮動小数点が存在するもの)をサポートする必要があることです。
浮動小数点のハードウェアサポートを想定してexeがコンパイルされている間に、libcはソフトウェアの浮動小数点演算用に構築されたようです。短期的には、コンパイラフラグとしてソフトフロートを強制できます。 (gccを使用している場合、-msoft-floatだと思います)
長期的には、ターゲットのプロセッサが浮動小数点演算のハードウェアをサポートしている場合、一般的に、高速化のためにハードウェアフロートを有効にしてクロスツールチェーンを構築または検索する必要があります。一部のプロセッサファミリには、ハードウェアサポートのあるモデルとないモデルがあります。したがって、たとえば、プロセッサがARMであると言うだけでは、ハードウェア浮動小数点サポートがあるかどうかを知るには不十分です。
計算は、浮動小数点ハードウェアまたは整数演算に基づくソフトウェアのいずれかで実行できます。
ハードウェアで実行する方がはるかに高速ですが、多くのマイクロコントローラーには浮動小数点ハードウェアがありません。その場合、浮動小数点の使用を回避するか(通常は最適なオプション)、Cライブラリの一部となるソフトウェアの実装に依存します。
一部のコントローラファミリ(ARMなど)では、ファミリの一部のモデルには浮動小数点ハードウェアが存在しますが、他のモデルには存在しないため、これらのファミリのgccは両方をサポートします。あなたの問題は、2つのオプションを混同しているようです。