2012-10-03 12 views
6

私はSAM3Nアームcortex-M3マイクロコントローラ用のCプログラムを作成しています。浮動小数点数を印刷しようとすると、単に 'f'が出力されます。 例:printf("%f",43.12);fのみを出力し、43.12は出力しません。arm-none-eabi-gcc:printfを使用してフロート番号を印刷する

しかし、整数で印刷すると問題はありません。

フロートのフルプリントを有効にするにはどうすればよいですか?私はコンパイラがデフォルトで、コードサイズを減らすためにフロート印刷を無効にしていることを知っています(つまり、カットダウンバージョンをリンクしているようです)。また、makefileにはCFLAGS=-Dprintf=iprintfが使用されていません。

ツールの詳細:

  • ARM/GNU Cコンパイラ:(crosstool-NG 1.13.1 - アトメルのビルド:13)アトメルスタジオ6.0に付属しているツールの上4.6.1
+0

AFAIKこのマイクロコントローラはFPUを持っていません。したがって、完全なprintf機能を有効にする方法については、libcにコンパイラのドキュメントを参照する必要があります。例えばAVRでは、 "-Wl、-u、vfprintf -lprintf_flt -lm"でした。別の方法として、ツールベンダーに連絡する必要があります。これはおそらく既知の問題です。 –

+0

残念ながら、この-lprintfはAVR-GCCのみで動作しますが、ARMでは動作しません。 – Prabhu

答えて

0

デフォルトでフロートが無効になっているコンパイラでは、デフォルトライブラリがそれらを処理できることは珍しいことです。参考文献を参照して、適切なライブラリをフロートサポートで再コンパイルする方法や、既にビルドされているバージョンをどこから見つけるかについての情報を見つけることができます。

+0

これは私が立ち往生した場所です。 libcを他のCライブラリで置き換える必要があると思います。 libcにはprintfが浮動できるprintfはありません。どのように私はそれを作ることができますどのような助け/提案? – Prabhu

+0

printfingフロートを正しくサポートしていないライブラリです - gccはそれに気を付けるべきではありませんか?別のlibcを探しているなら、newlibを試してみてください。http://sourceware.org/newlib/ – auselen

1

プラットフォーム/ libsがprintf/sprintfのフォーマット指定子%fをサポートしていない可能性があります。 最初のアプローチとして、あなたは、フロート/ダブルス用に独自のprintfをロールバックすることができます:

void printDouble(double v, int decimalDigits) 
{ 
    int i = 1; 
    int intPart, fractPart; 
    for (;decimalDigits!=0; i*=10, decimalDigits--); 
    intPart = (int)v; 
    fractPart = (int)((v-(double)(int)v)*i); 
    if(fractPart < 0) fractPart *= -1; 
    printf("%i.%i", intPart, fractPart); 
} 
+0

アイデアをありがとう、しかし私はすでにこれを回避するために(modf、lroundを使って)これを実装しました。そして私は適切なprintfが欲しかったので、コードはより洗練されたものになるでしょう。 – Prabhu

6

はあなたが試すことができ、リンカ設定で、以下のオプションを追加すること

-lc -lrdimon -u _printf_float

とそれは私のために働いたARM - CORTEXM0

+0

ARM Cortex-M4でも同様に動作します。 –

関連する問題