2016年12月25日

SW4STM32でprintfを使って浮動小数を出力したい

先日導入したSW4STM32は書き込みに手間が書かからず
OpenOCDを使えばデバッグもできオフラインで開発できます。

また、eclipseベースなのでPluginやMakerplaceを利用すれば自分好みの使いやすい環境にできます。

しかし、その代わりと言っては何ですが別の手間が要求されます。

まあとりあえずこれを見てください 

bandicam 2016-12-25 15-21-50-669
 
適当に円周率を表示するプログラムを書いてみます。

オンラインコンパイラ(RVDSだったかなぁ)を使っていた方であれば"PI:3.1415923"と
当たり前のように表示されると思う方が多いと思います。

しかし、オフラインコンパイラ(GCC ARM)の場合は初期設定のままでは実行結果は以下のようになってしまいます。

bandicam 2016-12-25 15-19-08-489

浮動小数の部分がきっちり抜けてPI:しか表示されないんです。
実はprintfの浮動小数処理はコード節約のためにデフォルトでは対応していません。

その為リンカーオプションをいじる必要があります。

手順ですが
まず、ProjectExplorerでプロジェクトのルートを右クリックし
Properties > C/C++ Build > Settings > MCU G++ Linker > Miscellaneous
に進みます。

bandicam 2016-12-25 16-04-54-391

デフォルトでは上部のLinker Flagsには
-specs=nosys.specs -specs=nano.specs  
と書かれていると思います。

この行に -u _printf_float を追加して
-specs=nosys.specs -specs=nano.specs  -u _printf_float に変更します。

これでprintfとかsprintfで%fにより浮動小数が扱えるようになります。

またscanfはまだしもsscanfを使うときがあるかもしれません
やはりこれらの便利関数も浮動小数に対応してなかったりします。
ついでに -u _scanf_float も追加しておきましょう。

注意する点としてはコードサイズが大きくなることですね。
比較的Flashサイズの小さいnucleo-32ボードでは気を付けた方がいいかもしれません。

以上で終わりです。

毎回設定するのはいささか面倒みがあることですが
浮動小数入出力なんてあまり使わないので覚えとくとイイこととして認識しておきましょう 

そういえば補足みたいなものですが、メモリ削減的にはオンラインコンパイラの方が断然いいかもしれません。
RDVSはメモリ削減率をアッピールしてるし?

そう考えると商用コンパイラを間接的にタダで使えるmbedは凄いな〜

nucleo32とか下位クラスのlpcマイコンであればオフラインコンパイラでコンパイルした方が良いかもね。
 


drttx at 16:41│Comments(0)弱電 | mbed

コメントする

名前
URL
 
  絵文字