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

  • 5
    Like
  • 0
    Comment
More than 1 year has 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回目でコンパイルが済んでいて最初からファイルがあるから?)
となってしまった。何とかならないものか…