Posted at

PlatformIOでmbedをオフラインビルドしSTM32 Nucleoボードでmrubyを使う

More than 3 years have passed since last update.

STM32 Nucleo F446REを買ったのでオフラインビルドの環境確認を兼ねてmrubyを動かしてみました。

F446REのスペック

Freq.
Flash
RAM

180 [MHz]
512 [Kb]
128 [Kb]

スイッチサイエンスで1900円。

(自分はコンビニ受け取りが便利なのでAmazonで2390円で購入)


とりあえず環境準備

こちらを参考にさせて頂きました

コマンドラインでArduino開発 : vim + platformio


  1. Python 2.7.Xをインストール

    僕はWindows用インストーラをUniversal Extractorで展開して.nyagosでPATHを通すスタイル


  2. setuptoolsをインストール

    setuptoolsのページからDLしてきてpython ez_setup.py


  3. pipをインストール

    easy_install pip


  4. PlatformIOをインストール

    pip install platformio


  5. SConsをインストール

    自分の環境ではpipでのインストールが上手く行かなかったのでeasy_installを使いました。

    easy_install scons



mbed(STM32 Nucleo)プロジェクトの作成

platform boardsで対応しているボードの一覧が確認できます。

適当にディレクトリ切って

platform init --board nucleo_f446reとコマンドを打つとplatformio.inilib/ 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を設定しアップロードまで一気にできるようにしておきます。


platformio.ini

[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 run1回目リンクエラー

platformio run2回目成功(1回目でコンパイルが済んでいて最初からファイルがあるから?)

となってしまった。何とかならないものか…