STM32 Nucleo F446REを買ったのでオフラインビルドの環境確認を兼ねてmrubyを動かしてみました。
F446REのスペック
Freq. | Flash | RAM |
---|---|---|
180 [MHz] | 512 [Kb] | 128 [Kb] |
スイッチサイエンスで1900円。 | ||
(自分はコンビニ受け取りが便利なのでAmazonで2390円で購入) |
とりあえず環境準備
こちらを参考にさせて頂きました
コマンドラインでArduino開発 : vim + platformio
-
Python 2.7.Xをインストール
僕はWindows用インストーラをUniversal Extractorで展開して.nyagos
でPATHを通すスタイル -
setuptoolsをインストール
setuptoolsのページからDLしてきてpython ez_setup.py
-
pipをインストール
easy_install pip
-
PlatformIOをインストール
pip install platformio
-
SConsをインストール
自分の環境ではpipでのインストールが上手く行かなかったのでeasy_installを使いました。
easy_install scons
mbed(STM32 Nucleo)プロジェクトの作成
platform boards
で対応しているボードの一覧が確認できます。
適当にディレクトリ切って
platform init --board nucleo_f446re
とコマンドを打つとplatformio.ini
とlib/
src/
が作られるのでsrc/
にソースファイルを追加していきます。
途中で聞かれる選択肢は、とりあえずN
y
で。
プロジェクト作成の初回にはコンパイラツールチェインのDLが行われるため少し時間がかかります。
コンパイラ等は
%USERPROFILE%/.platformio/packages/toolchain-gccarmnoneeabi
にDLされると思います。次のmrubyのビルドで使用するので
%USERPROFILE%/.platformio/packages/toolchain-gccarmnoneeabi/bin
にPATHを通しておきましょう。
mrubyのビルド
こちらのページを参考にさせて頂き、問題なくビルド完了。
上記ページのサンプル中の
- #include "test.c"
このインクルードは不要、のはず。
ソースコード、ライブラリの準備
ソースコード
上述のページのサンプルをコピペしてsrc/
に配置。ファイル名は何でもOK。
mruby関係
プロジェクトディレクトリにscripts/
という名前でディレクトリを切り、mrubyのリンクライブラリやインクルードファイルを設置。ディレクトリ名はscripts/
でないとダメ。
scripts/
以下の構成は自由ですが、今回はこのようにしました。
├─lib
│ readme.txt
│
├─scripts
│ └─mruby
│ ├─include
│ │ │ mrbconf.h
│ │ │ mruby.h
│ │ │
│ │ └─mruby
│ │ array.h
~~~~~~~~~~~~ (省略) ~~~~~~~~~~~~
│ │ version.h
│ │
│ └─lib
│ libmruby.a
│
└─src
main.cpp
test.rb
platformio.iniの修正
mrubyをリンクするためのコンパイルオプションの設定と
upload_protocol
を設定しアップロードまで一気にできるようにしておきます。
[env:nucleo_f446re]
platform = ststm32
framework = mbed
board = nucleo_f446re
build_flags = -Imruby/include -Lmruby/lib -lmruby
# targets = upload
upload_protocol = stlink
上記のように設定しても、includeファイルとlibのサーチパスは
勝手にscripts/mruby/include/
とscripts/mruby/lib
となるようです。
そのためライブラリの設置はscripts/
としています。
ビルドしてみる
まずsrc/test.rb
のコンパイル
$ mrbc -B bytecode src/test.rb
続いて全体のビルド
$ platformio run
アップロードまで行うなら
$ platformio run --target upload
未解決
rubyスクリプトのコンパイルまでplatformioで一気にやっちゃいたい。
extra_script
でやろうとしたが、ファイル構成のチェックが先に行われるのか
platformio run
1回目リンクエラー
platformio run
2回目成功(1回目でコンパイルが済んでいて最初からファイルがあるから?)
となってしまった。何とかならないものか…