Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

GNU Arm Compiler のPRINTF と SCANF の 浮動小数点サポートについて – Community Translated (JA)

GNU Arm Compiler のPRINTF と SCANF の 浮動小数点サポートについて – Community Translated (JA)

Praveen
Community Manager
Community Manager
Community Manager
25 solutions authored 10 likes given 5 likes given

Community Translated by  MoTa_728816          Version : *A

質問PSoC® Creator™ sprintf を使用した文字列に浮動小数点の値が反映されません。原因と対策を教えてください。

回答PSoC Creator 3.0 のリリースで、私たちはGNU Armコンパイラを CodeSourcery から GNU Arm に変更しました。

後者はnewlib newlib-nanoのライブラリを選択できます。PSoC はメモリ容量に余裕がないため、ほとんどの PSoC 4 PSoC 5LP の設計においてフラッシュとRAMを節約するために、newlib-nano をデフォルトとしました。しかし、newlib-nano では浮動小数点文字列のフォーマットをサポートするためには浮動小数点処理を有効にする必要があります。

問題下記のようなコードの一部を考えます。

            char My_String[30] ;

            double My_Float = 3.14159;

            sprintf(My_String, “Value of pi is %.2f to 2dp”, My_Float);

この結果のMy_String “Value of pi is: to 2dp” です。

3.14 My_String に含まれません。

これは新しくGNU Arm コンパイラツールチェーンを使用した PSoC 4 PSoC 5LP のプロジェクトのデフォルト C ランタイムライブラリとなった newlib-nano ライブラリが浮動小数点フォーマットをサポートするためには、浮動小数点サポート関数をリンクする必要があるためです。これらの関数はデフォルトではリンクされません。

対策

  1. Newlib-nano の浮動小数点フォーマットサポートを有効にする

メニューから Project > Build Settings > Arm GCC 4.7.3 > Linker > Command Line を開いてください。Custom Flags 欄に “-u _printf_float” を追加してください。

この変更はアプリケーションのフラッシュ使用量を 10Kバイトから15Kバイト程度、RAMの使用量を少々増加させます。

kba14_1.png

  2. ライブラリ全体を変更する

二つ目の方法はライブラリ全体を変更することです。

メニューから Project > Build Settings Arm GCC 4.7.3 > Linker > General を開いてください。“Use newlib-nano” False に設定してください。

これでライブラリは newlib に変更され、すべてのランタイムライブラリの機能がサポートされますが、フラッシュの使用量が25Kバイトから 35Kバイト程度増加しRAMの使用量も 2Kバイト程度増加します。

kba14_2.png

sscanf の対策sscanf についても同様の問題が存在します。例えば、下記のようなコードの一部を考えます。

            char My_String[30] = “Pi is 3.14” ;

            char My_Str1[10], My_Str2[10] ;

            float Pi = 2.0;

            sscanf(My_String, “%s %s %f”, My_Str1, My_Str2, &Pi);

これは My_Str1 “Pi” を、My_Str2 “is” を代入しますが、Pi 2.0のままで期待した 3.14 は代入されません。

sprintf の使用方法で説明したものと同様の対策が適用できます。

ただし1.の方法では、追加するフラグを“-u _scanf_float”としてください。

の方法でprintf scanf 関数の両方を使用する場合は、両方のフラグを使用する必要があります。

PSoC Creator 3.1 および以降のバージョンでは設定が少し異なります。newlib-nano で浮動小数点サポートを直接有効にするオプションが追加されています。この設定は下図を参照してください。

kba14_3.png

プロジェクトの設定でsprintf sscanf をサポートするのに必要なHeapサイズが設定されていることを確認してください (.cydwr > System > Heap Size)。デフォルトの値は0x80ですが、これらの関数をサポートするためには十分ではありません。もっと大きな 0x1000 等の値に設定することが可能です。

0 件の賞賛
1650 件の閲覧回数
寄稿者