mruby IoT framework ‘Plato’と
mruby IoT framework ‘Plato’と
mrubyのポーティング研修テキスト
mrubyのポーティング研修テキスト
特定非営利活動法⼈軽量Rubyフォーラム 特定非営利活動法⼈軽量Rubyフォーラム
本研修について
•
mruby概要
•
mruby IoTフレームワーク “Plato”
•
mrubyポーティング
mrubyポーティング
•
mrubyポーティング環境へのPlatoの適用
mruby
概要
mruby
概要
“Ruby”を省リソース化した“mruby”の概要・特
徴
“Ruby”を省リソース化した“mruby”の概要・特
徴
mrubyとは
•
高い生産性で人気の言語Rubyの軽量版
「mruby」
「mruby」
–
RAMサイズ200KB程度で動作可能
–
組込み機器にも搭載可能
–
組込み機器にも搭載可能
•
経済産業省「地域イノベーション創出研究開発
•
経済産業省「地域イノベーション創出研究開発
事業」の研究成果として2012年4月に
「mruby」を公開
事業」の研究成果として2012年4月に
「mruby」を公開
Rubyの高い生産性
ソケット通信の実装例
require 'socket'
#include <stdio.h> require 'socket'
begin sock = TCPSocket.open("192.168.1.1", 30000) 10.times { sock.write("Hello!!") } #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> int main(void) { int sock; C言語 (35行) Ruby } sock.close rescue => e p e end int sock; int i;
struct sockaddr_in svaddr; const char msg[] = "Hello!!";
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { puts("socket() failed."); return 1; Ruby (10行) return 1; } memset(&svaddr, 0, sizeof(svaddr)); svaddr.sin_family = AF_INET; svaddr.sin_addr.s_addr = inet_addr("192.168.1.1"); svaddr.sin_port = htons(30000);
if (connect(sock, (struct sockaddr*)&svaddr, sizeof(svaddr)) < 0) { • 短いコード • 簡潔な記述 • ポインタ操作なし • メンテナンス性が高い sizeof(svaddr)) < 0) { puts("connect() failed."); exit(2); }
for (i=0; i<10; i++) {
if (send(sock, msg, strlen(msg), 0) != strlen(msg)) { • メンテナンス性が高い • コードが長くなりがち strlen(msg)) { puts("send() failed."); exit(3); } } close(sock); return 0; } • コードが長くなりがち • 処理が複雑になりがち • 危険なポインタ操作 • メンテナンス性が低い }
mrubyの特徴
ISO, JIS規格のRubyに準ずる言語仕様
•
ISO, JIS規格のRubyに準ずる言語仕様
–
本家Rubyと同様に使える
–
本家Rubyと同様に使える
•
コンパクトな処理系「mruby VM」
•
コンパクトな処理系「mruby VM」
–
mrubyコンパイラが出⼒するバイトコードを
実⾏
実⾏
–
VMさえ動作すればどんな環境でも動作可能
Windows, Mac, Linux, ITRON, Android,
Windows, Mac, Linux, ITRON, Android,
iOS ...
補足: Rubyとmruby
Ruby mruby インタプリタ言語 インタプリタ言語/コンパイラ言語 C言語モジュールの呼び出しが可能 C言語モジュールの呼び出し、C言語から C言語モジュールの呼び出しが可能 C言語モジュールの呼び出し、C言語から の呼び出しが可能 実行時にRubyGemsで機能拡張が可能 ビルド時にmrbgemsで機能拡張が可能 実行時にRubyGemsで機能拡張が可能 ビルド時にmrbgemsで機能拡張が可能 ※mrbgemsとRubyGemsとは互換性なし Integer同士の演算 → Integer Float同士の演算 → Float 演算結果が整数値→Integer 演算結果が浮動小数値→Float Float同士の演算 → Float 演算結果が浮動小数値→Float 非常に大きな整数値はBignumで扱われ る 非常に大きな整数値はFloatで扱われる 正規表現を標準装備 正規表現はオプション 正規表現を標準装備 正規表現はオプション ※複数から選択可能ASCII, Shift_JIS, UTF-8など様々な文字 文字コードはASCII, UTF-8のみ利用可能 ASCII, Shift_JIS, UTF-8
コードが利用可能 ASCII, UTF-8 ※UTF-8はオプション バイナリ配布(ソースコードも入手可) ソースコード配布 ※容易にカスタマイズ可能 ※容易にカスタマイズ可能
mrubyを支えるコミュニティ
•
オープンソースコミュニティ
–
3,700人超のフォロワー
オープンソース–
3,700人超のフォロワー
–
200人以上のコントリビュータ
–
7,700件を超える改良・修正
・ オープンソース として成⻑ ・Creative ・Powerful–
7,700件を超える改良・修正
https://github.com/mruby/mruby (mruby公開サイト)•
NPO軽量Rubyフォーラム
–
ワーキンググループによる活動
–
ワーキンググループによる活動
会員企業による商IoT/M2M時代の新言語 - mruby
ものとインターネット、ものとものが繋がる → 全てのものがネットワークに繋がっていく → 全てのものがネットワークに繋がっていく 組込み分野もフロンティア領域を重点分野として新しい市場が形成されて いく → これに対応した組込み開発が必須になっていく → これに対応した組込み開発が必須になっていく 経済産業省 組込み開発の今後 資料よりPlato
Plato
mruby IoT framework
-mruby IoTフレームワーク “Plato”の概要
mruby IoTフレームワーク “Plato”の概要
mruby IoT framework “Plato”
Plato (仮) - mruby IoT framework
• NEDO助成事業「組込みシステムの⾼効率開発を可能とする開発 • NEDO助成事業「組込みシステムの⾼効率開発を可能とする開発 フレームワークの研究開発」にて開発中(〜2017/2) (九州工業大学、有明工業高等専門学校、SCSK九州) (九州工業大学、有明工業高等専門学校、SCSK九州) • mrubyによるIoT製品開発の効率化 • マイコンボードとシームレスに繋がる統合開発環境の提供 • マイコンボードとシームレスに繋がる統合開発環境の提供 • 組込み向けセキュリティ機能の提供 White-Tiger White-Tiger センサボード Plato IDE
“Plato”で出来ること
mrubyによるIoT製品開発の効率化
• 組込み向けデバイスクラスライブラリの提供 • 組込み向けデバイスクラスライブラリの提供 • BLE、WiFi、ZigBeeなど様々な通信方式にも対応BLE、WiFi、ZigBeeなど様々な通信方式にも対応 • 典型的なアプリケーションの雛形を自動生成 (Railsのように) (Railsのように) • シミュレータによるPC上でのシミュレーション“Plato”で出来ること
mrubyボード(enzi) + センサボード(White-Tiger)
• 汎用IO • 汎用IO • デジタル/アナログIO、UART、I2C、SPI • センサ • センサ • 温度、湿度、照度 • 通信デバイス • BLE • Wi-Fi • Wi-Fi • ZigBee • Ethernet • ファイルシステム • RTC • RTC“Plato”で出来ること
Plato IDE
• Visual Studio Codeベースの開発環境 • Visual Studio Codeベースの開発環境
(マルチ環境に対応) • アプリ構成、使用ライブラリをGUIで指定 • アプリ構成、使用ライブラリをGUIで指定 • アプリケーションのコンパイル • アプリケーションのコンパイル • アプリケーションのシミュレーション実⾏ • マイコンへのプログラム書き込み
“Plato”で出来ること
セキュリティ機能 “Plato Guard”
IoT時代に必要となるセキュリティ機能をオプションで提供 IoT時代に必要となるセキュリティ機能をオプションで提供 • 認証機能による不正アプリケーション実⾏の防⽌ (外部からの攻撃、乗っ取りから守る) 認証機能による不正アプリケーション実⾏の防⽌ (外部からの攻撃、乗っ取りから守る) • 暗号化による実⾏モジュール秘匿化 • 暗号化による実⾏モジュール秘匿化 (アプリケーション資産の漏洩を防ぐ)“Plato”が目指すところ
○rduinoよりも簡単に組込み開発を
• mruby(Ruby)でプログラミングできる • mruby(Ruby)でプログラミングできる • 多くのマイコンボードに対応 (バイトコード互換) 多くのマイコンボードに対応 (バイトコード互換) • 必要なデバイスに応じてVMをカスタマイズできる • 必要なデバイスに応じてVMをカスタマイズできる • mruby/cにも対応予定 (⼩サイズ、省電⼒) (⼩サイズ、省電⼒)mrubyポーティング
mrubyポーティング
マイコンボードへのmruby適用
マイコンボードへのmruby適用
mrubyポーティング
mrubyポーティングのために必要なこと
• mrubyビルド環境の構築 • mrubyビルド環境の構築 • mrubyのクロスビルドmrubyのクロスビルド • ターゲットアプリへのmruby組込みmrubyビルド環境の構築
mrubyビルド環境の構築
以下の環境を準備する。 以下の環境を準備する。 • 開発OS • Microsoft Windows 開発OS • Microsoft Windows • Mac これら以外のOSも利⽤可能であるが、本書ではこれら2つに これら以外のOSも利⽤可能であるが、本書ではこれら2つに 限定して紹介する。 • 本家Ruby • 本家Ruby • Cコンパイラ • GNU Bison • git • gitmrubyビルド環境の構築
本家Rubyの導入
Windowsの場合
• 下記サイトよりRubyInstallerをダウンロードし、最新版のRuby 環境インストールする。(Ruby 2.0以降を推奨) 環境インストールする。(Ruby 2.0以降を推奨) https://rubyinstaller.org/Macの場合
• Mac OSにプリインストールされているRubyが利⽤可能。 • Mac OSにプリインストールされているRubyが利⽤可能。mrubyビルド環境の構築
Cコンパイラの導入
Windowsの場合
• Cコンパイラを含むC言語開発環境をインストールする。 利⽤可能なC⾔語開発環境の⼀例 利⽤可能なC⾔語開発環境の⼀例• Microsoft Visual Studio • gcc (MinGW)
• gcc (Cygwin) • gcc (Cygwin)
Macの場合
Macの場合
mrubyビルド環境の構築
GNU Bisonの導入
Windowsの場合
• 下記サイトよりBisonのインストーラをダウンロードしセット アップする。 アップする。 http://gnuwin32.sourceforge.net/packages/bison.htmMacの場合
Macの場合
• 以下のコマンドを実⾏してBisonをインストールする。brew install bison brew install bison
mrubyビルド環境の構築
gitの導入
Windowsの場合
• 下記サイトよりgit for Windowsのインストーラをダウンロード
しセットアップする。 しセットアップする。 https://git-for-windows.github.io/
Macの場合
Macの場合
• 以下のコマンドを実⾏してgitをインストールする。brew install git brew install git
mrubyビルド環境の構築
mrubyのビルド
1. mrubyソースコードの入手とビルド 1. mrubyソースコードの入手とビルド 以下のコマンドを実⾏し、mrubyソースコードを入手し、ビル ドする。 ドする。 cd <任意のディレクトリ>git clone https://github.com/mruby/mruby git clone https://github.com/mruby/mruby cd mruby
make
mrubyのクロスビルド
mrubyクロスビルドで必要な作業
• ターゲットボード用ツールチェインの入手 • ターゲットボード用ツールチェインの入手 • ビルドスクリプトの記述ビルドスクリプトの記述
mrubyのクロスビルド
ターゲットボード用ツールチェインの入手
ターゲットボード向けのソフトウェア開発に必要なツールチェイン ターゲットボード向けのソフトウェア開発に必要なツールチェイン (コンパイラ・リンカなどのセット)をセットアップする。 例えば、ARMプロセッサ⽤であれば以下のツールチェインが利⽤可 例えば、ARMプロセッサ⽤であれば以下のツールチェインが利⽤可 能。GNU ARM Embedded Toolchain
mrubyのクロスビルド
ビルドスクリプトの記述
mrubyのビルド構成はビルドスクリプト(build_config.rb)に記述さ mrubyのビルド構成はビルドスクリプト(build_config.rb)に記述さ れている。ターゲットボード向けにクロスビルドするには、 build_config.rbにクロスビルド用の記述を追加する必要がある。 build_config.rbにクロスビルド用の記述を追加する必要がある。 build_config.rbの概要 ホスト(開発環境)用のビルド構成 MRuby::Build.new do |conf| end MRuby::Build.new('host-debug') do |conf| ホスト(開発環境)用のビルド構成 build/host デバッガ、unitテスト、ベンチマーク用の end MRuby::Build.new(’test') do |conf| end デバッガ、unitテスト、ベンチマーク用の ビルド構成 build/host-debug build/test MRuby::Build.new(’bench') do |conf| end MRuby::CrossBuild.new('hoge') do |conf| build/test build/bench 追加するターゲット用のクロスビルド構成 MRuby::CrossBuild.new('hoge') do |conf| end 追加するターゲット用のクロスビルド構成 build/ターゲット名mrubyのクロスビルド
ビルドスクリプトの記述
build_config.rbに追加するクロスビルド⽤の記述例を以下に⽰す。 build_config.rbに追加するクロスビルド⽤の記述例を以下に⽰す。 MRuby::CrossBuild.new('hoge') do |conf| toolchain :gcc conf.linker.flags << “-m32“ リンカオプション conf.linker.flags << “-m32“ conf.cc do |cc| cc.command = 'arm-none-eabi-gcc' cc.flags = [] cc.flags << '-mcpu=cortex-m4‘ コンパイラオプション cc.flags << '-mcpu=cortex-m4‘ cc.flags << '-std=gnu99‘cc.flgas << ‘-mfpu=fpv4-sp-d16 –mfloat-abi=soft‘ # 省略
end
conf.bins = []
コンパイラオプション
conf.bins = []
mrubyのクロスビルド
クロスビルド実⾏
build_config.rbへのクロスビルド定義の追加が終わったら、mruby build_config.rbへのクロスビルド定義の追加が終わったら、mruby をリビルドすることでmrubyのクロスビルドが実施される。 cd mruby cd mrubymake clean all
ターゲット名を ‘hoge’ とした場合は、クロスビルドによって、以下 のmrubyスタティックライブラリが生成される。
mrubyのクロスビルド
ターゲットアプリへのmruby組込み
クロスビルドで作成した libmruby.a をターゲットアプリケーショ クロスビルドで作成した libmruby.a をターゲットアプリケーショ ンにスタティックリンクすることで、ターゲットアプリケーション にmrubyを組み込むことができる。 にmrubyを組み込むことができる。 ターゲットアプリケーションからmrubyを呼び出すためには mrubyのC APIを使用する。 mrubyのC APIを使用する。 ターゲットアプリケーションからのmrubyの呼び出し例を以下に⽰ す。 す。mrubyのクロスビルド
ターゲットアプリへのmruby組込み
ターゲットアプリ(main.c)とC言語側から呼び出すmrubyアプリ ターゲットアプリ(main.c)とC言語側から呼び出すmrubyアプリ (app.rb)の例を以下に⽰す。 main.c main.c #include ”mruby.h” #include “mruby/irep.h” #include <stdio.h> #include <stdio.h> void main(void) {extern uint8_t appbin[]; mrb_state *mrb = mrb_open(); mrb_value v; mruby VMの初期化 mrubyアプリケーションの実行 mrb_value v; v = mrb_load_irep(mrb, appbin); puts(mrb_string_value_cstr(mrb, v)); mrb_close(mrb); } mruby VMの終了 mrubyアプリケーションの実行 app.rb } mruby VMの終了 “Hello, mruby!“
mrubyのクロスビルド
ターゲットアプリへのmruby組込み
以下のコマンドでmrubyアプリケーションをコンパイルする。 以下のコマンドでmrubyアプリケーションをコンパイルする。 mrbc –Bappbin –o app.c app.rb
mrbc –Bappbin –o app.c app.rb
main.c、上記コンパイル結果(app.c)をコンパイルし、前述の libmruby.a と共にリンクすることで、mrubyを追加したターゲッ libmruby.a と共にリンクすることで、mrubyを追加したターゲッ トアプリケーションが完成する。 ターゲットボード上で実⾏し、ターミナルソフトなどで ターゲットボード上で実⾏し、ターミナルソフトなどで
mrubyポーティング環境への
mrubyポーティング環境への
Plato適用
Plato適用
マイコンボード向けPlatoカスタマイズ
マイコンボード向けPlatoカスタマイズ
mrubyポーティング環境へのPlato適用
Platoのボード対応に必要なこと
mruby IoT framework – Plato を新たなターゲットボードに対応 mruby IoT framework – Plato を新たなターゲットボードに対応 させるためには以下が必要となる。
• Plato IDEへのターゲットボード登録 • Plato IDEへのターゲットボード登録 • デバイスI/F層ライブラリの実装
mrubyポーティング環境へのPlato適用
Plato IDEへのターゲットボード登録
Plato IDEにターゲットボードを追加するには、以下の情報が必要と Plato IDEにターゲットボードを追加するには、以下の情報が必要と なる。 • ターゲットボード名 • ターゲットボードID ターゲットボード名 • ターゲットボードID ターゲットボードIDはライブラリの識別⼦としても使⽤されるため、 ターゲットボードIDはライブラリの識別⼦としても使⽤されるため、 一意な名称を指定する必要がある。mrubyポーティング環境へのPlato適用
デバイスI/F層ライブラリの実装
Platoが提供するライブラリ群はmrubyライブラリ(mrbgems)形式 Platoが提供するライブラリ群はmrubyライブラリ(mrbgems)形式 で実装されている。 Plato提供ライブラリ群のうち、デバイスI/F層のライブラリは動作 環境毎に提供される。 Plato提供ライブラリ群のうち、デバイスI/F層のライブラリは動作 環境毎に提供される。 ターゲットボードを追加する場合には、ターゲットボードのデバイ スI/F層ライブラリを実装・提供する必要がある。 スI/F層ライブラリを実装・提供する必要がある。 提供するライブラリは以下の命名規則に従う必要がある。 mruby-plato-XXXXX-<デバイスID>mrubyポーティング環境へのPlato適用
デバイスI/F層ライブラリの実装
参考までにenziボード用に提供されているデバイスI/F層ライブラリ 参考までにenziボード用に提供されているデバイスI/F層ライブラリ の一覧を示す。 ライブラリ ライブラリライブラリ ライブラリライブラリ 内容内容内容内容 ライブラリライブラリ ライブラリ 内容内容内容内容 mruby-plato-analogio-enzi アナログI/Oライブラリ mruby-plato-digitalio-enzi デジタルI/Oライブラリ mruby-plato-digitalio-enzi デジタルI/Oライブラリ mruby-plato-gpio-enzi GPIOライブラリ mruby-plato-i2c-enzi I2Cライブラリ mruby-plato-machine-enzi マシンライブラリ (delay等) ※必須 mruby-plato-serial-enzi シリアル(UART) I/Fライブラリmruby-plato-spi-enzi SPIライブラリ
これらのうちマシンライブラリは必須であるが、それ以外は必要に 応じて実装すれば良い。
mruby-plato-spi-enzi SPIライブラリ