2

Quadravox、AQ430開発ツールからVisualGDB Cコンパイラに変更して、別のCコンパイラを使用してTexas Instruments(TI)MSP430マイクロコントローラ用に完全にテストされたCプログラムをアップグレードしています。

プログラムは、VisualGDBを使用してエラーと警告をゼロにしてコンパイルします。割り込みサービスルーチン、タイマー、UART制御など、すべてが機能しているようです。ただし、sprintfの特定の使用法は機能していません。例えば:

unsigned int duration;
float msec;

msec = (float)duration;

msec = msec / 125.0;

sprintf(glb_response,"break: %3.1f msec",msec);

これは次を返します:break: %3.1f msec

これは予想されることです:break: 12.5 msec

私は次のことを学びました(ウィキペディアから):

コンパイラオプション--printf_support=[full | 最小限| nofloat]を使用すると、printf / sprintfのより小さく、機能が制限されたバリアントを使用し、ビルド時にその選択を行うことができます。

有効な値は次のとおりです。

full:すべてのフォーマット指定子をサポートします。これがデフォルトです。

nofloat:浮動小数点値の印刷のサポートを除外します。%f、%g、%G、%e、および%Eを除くすべてのフォーマット指定子をサポートします。

最小:幅または精度フラグなしの整数、文字、または文字列値の印刷をサポートします。具体的には、%%、%d、%o、%c、%s、および%x形式指定子のみがサポートされます

printfを完全にサポートする必要があります。このCプログラムは何年にもわたって使用されているため、私の製品のMSP430がこれをサポートすることを私は知っています。

私の問題は、1)VisualGDBにprintfサポートを完全に設定する手段があるかどうか、2)ある場合、どこで、どこに設定するかがわからないことです。

ありとあらゆるコメントと回答をいただければ幸いです。

4

2 に答える 2

11

浮動小数点の完全なサポートは不要であり、賢明ではないことをお勧めします。些細な問題を解決するのは大量のコードです。また、浮動小数点ハードウェアがない場合、パフォーマンス、コードスペース、およびメモリ使用量の理由から、通常、浮動小数点演算はどのような場合でも回避するのが最善です。

したがってduration、1/125000秒の単位であり、0.1ミリ秒の精度で値を出力したいようです。それで:

unsigned msec_x10 = duration * 10u / 125u ;

sprintf( glb_response, 
         "break: %u.%u msec", 
         msec_x10 / 10,  
         msec_x10 % 10 ) ;

(切り捨てではなく)最も近い10分の1に丸める場合は、次のようにします。

unsigned msec_x10 = ((duration * 20u) + 125 ) / 250u ;
于 2012-09-22T16:43:22.903 に答える
4

私はクリフォードに同意します。フロートが必要ない場合(または印刷にのみ必要な場合)は、フロートを使用しないでください。

ただし、プログラムですでにfloatを広範囲に使用していて、それらを印刷する方法が必要な場合は、SQLiteなどのパブリックドメインのprintfを採用することを検討してください。

于 2012-09-22T17:13:44.467 に答える