SW4STM32

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|PermalinkComments(0)

2016年12月16日

SW4STM32を使ったmbedオフラインコンパイル

最近何かと話題のmbedを使ってみました。
今回買ったのはnucleoボード!!
一枚1~2千円で買えるしコスパ最高です。

image

早速2枚買いです。取り合えずF401とF446を買っておきました。

mbedと言ってもmbedはオンライン開発環境であり僕的にはあまり好ましいとは思っていませんでした。 

じゃあなんかのIDEでstmが配布してるHALを使ってプログラムを書けば?という意見もあるかもしれませんが
あれはヤバいです。使えるようになるには相当な時間が必要だと思われます。 

1600ページある公式解説文もかなり簡素なものでゼロコンマニ秒で読む気が失せます。
素人意見ですがHALはどうしても必要な時だけ利用するのが良いと思われます。
取り敢えず今は全てを包容してくれるmbedの恩恵を受けておきましょう。 

そんなこんなで神々しい開発ツールmbedですが
ちょっと手間をかければオフラインでも開発できてしまいます。 

ようはARM開発環境さえあればいいってわけよ。
というか僕まだオンライン環境で開発してないし草も生えない
 
今回はIDEにeclipseベースの無料開発環境であるSW4STM32を使いました。
なんといっても無料なのにコンパイル時のフラッシュ容量制限が無いところが強みかな?

開発環境の構築法はネットで漁ると先人の方々が懇切丁寧に解説されているためそちらを参照してください。 

役に立つかどうかはわかりませんがオフラインコンパイルの手順を記しておきます。

まずmbedCompilerから適当にプロジェクトを制作してエクスポートします。
今回はプロジェクト名をtestとしました。

bandicam 2016-12-25 02-33-32-222
bandicam 2016-12-25 02-33-48-749
Export Targetを自分の使用するマイコンに、Exportt TollchainをSW4STM32にしExportします。
するとzip形式のファイルがダウンロードされると思います。 

どうやらダウロードされるファイルはプロジェクト名の後にマイコンボード名が付くようですね。

次にSW4STM32を起動し、右上のFileをクリックし
Import>Exsing Projects int Workspace
まで進みましょう

そこでSelect archive fileをチェックし、先ほどダウンロードしたzipファイルを参照しFinishをクリックします。

bandicam 2016-12-25 02-44-21-534

するとproject explorerにインポートしたtestが追加されてると思います。 

これでプロジェクトのインポートをは完了です。


次にプロジェクトをビルドします。ビルドはツールバーにあるハンマーのマークをクリックするかCtrl+Bです。
するとエラーが出ると思います。 (現状ではエラーが出ると勝手に結論付けてる)
  bandicam 2016-12-25 02-52-30-567

どうやらMBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATEがtest/mbed/drivers内のRawSerial.hとSerial.h内で定義されていないようです。 

MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATEはmbed_config.h内で定義されており定義内容は9600です。これはデフォルトのシリアル通信の通信速度の値です。

対応としてはmbed_config.hをインクルードするかMBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATEを9600(任意の値で可)に書き換えることで解決します。

書き換えるとビルドができるようになるので適当にプログラムを書いてみましょう 。 

書くもクソも最初からテンプレートが書かれていました。 

bandicam 2016-12-25 03-12-42-172

途中でエラーが出ていなかったらとりあえず書き込んでみます。

書き込み方法はいくつかります。
一つ目はツールバーの再生マークのrunをクリックもしくはCtrl+F11で書き込みます。

bandicam 2016-12-25 03-11-56-434

複数出てくることもありますが、自分の書き込みたいものを選んでOKを押しましょう 

するとマイコンボードのST-Link側のLEDが点滅してプログラムが書き込まれます。

別の方法はプロジェクトを右クリックして
Target>program chipをクリックして書き込みます。 
bandicam 2016-12-25 03-22-56-851

OKを押せば先ほどと同様にLEDが点滅して書き込まれます。

もう一つの方法はプロジェクト内のDebugファイル内にできたbinファイルをいつも通りの方法で書き込む方法です。

これはmbed本来の書き込み方法と同じなので説明の必要はありませんね


以上で解説は終わりなのですが。注意というかやった方が言いことを書いときます。 

ビルドしたときに.elfファイルが作れないとか、書き込むときにそんなファイルねぇよと警告文が出てきたときはファイルパスを短くするか、プロジェクトのcleanをやってみてください。大抵解決します。
ちなみにcleanはツールバーのprojectのところにあります。


いろんな意味で残念な解説になりましたがこれで終わりです。 

次回は外部コンパイラを使った際の問題について書きたいと思います。


続きを読む

drttx at 01:20|PermalinkComments(0)