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