2

Atmel Studio 7 で std C 関数 printf() を使用して、コンソールで文字列と整数を出力するように Atmel の ARM Cortex M0 の UART を構成しました。

ケースⅠ

printf() タイプの関数を浮動小数点値で出力しようとしています。そのために、次の提案に従いました。

arm-none-eabi-gcc : printf を使用して浮動小数点数を出力する

その後、テキストに続くリンカフラグを別の時間に個別に編集/追加しました:

-lc -u _printf_float
-lc -lrdimon -u _printf_float 

ケースⅡ

彼らが言ったことをすべて理解することはできませんでしたが、このフォーラムからもメイクファイルを編集するためのいくつかの提案に従いました。

浮動小数点変数の Printf/Sprintf が機能しない

メイクファイル内に次のテキストを追加しました

ldflags-gnu-y += -lc -u _printf_float 

Makefile パス (Atmel Studio 7、ASF を使用): ../src/ASF/sam0/utils/make/Makefile.sam.in

main.c で、次のように浮動小数点数を出力するために printf() を使用しました。

float a = 345.65412;
char buffr[20];         
/* --- Print Float using printf only --- */
printf("Float Number 1 : %f\r\n", a);   
/* --- Print Float using sprintf ---*/
sprintf(buffr, "Float Number ( Using Sprintf) : %3.3f\r\n", a); 
printf(buffr);

UART コンソール アプリでの出力:

ケース I :

Float Number 1 : 2.000000
Float Number ( Using Sprintf) : -0.000

ケース II :

Float Number 1 : 
Float Number ( Using Sprintf) :

Atmel Studio 7 の ARM Cortex M0 (SAM B 11) のコンソールで浮動小数点数を印刷するために、printf()、sprintf()、または vprintf() を動作させるようにリンカーを構成する方法を知っている人はいますか?

4

1 に答える 1

1

データに対してバッファが小さすぎます

char buffr[20];

少なくともある必要があります(0.0フォーマット出力と見なして)

char buffr[38];

バッファが小さいと、配列の「範囲外の書き込み」が発生します。これは、未定義の動作があり、a変数が汚染されていることを意味します。

sprintfは とは異なりprintfます。すべての文字を出力バッファーにコピーするため、書式指定子によって追加されるテキストとすべての文字にスペースを与える必要があります。

あなたの特定のケースでは:

  • Float Number ( Using Sprintf) :--> 32 文字かかります
  • %3.3f--> の実際の出力のために 7 文字かかります345.654
  • \r\n--> 2 文字かかります
  • null ターミネータには最後のバイトが必要です'\0'

そのメナはあなたのバッファでなければなりません:

char buffr[42];
于 2016-05-12T08:21:10.040 に答える