154
2018323特定非営利活動法人 軽量Rubyフォーラム SCSK九州 株式会社

Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

2018年3月23日 特定非営利活動法人 軽量Rubyフォーラム

SCSK九州 株式会社

Page 2: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

目的 軽量Ruby「mruby」をマイコンボードにポーティングし 機能拡張することで、mrubyによる組込みソフトウェア 開発技術の基礎を習得する

目標 mrubyの概要・特徴の理解 mrubyライブラリ開発技術の習得 mrubyポーティング技術の習得

2 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 3: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

1. mrubyの概要・特徴

2. mruby開発環境の構築

3. mrubyの実行

4. mrubyの機能拡張

5. mrubyのポーティングの概要

6. ターゲット開発環境の構築

7. mrubyのポーティング

8. mrubyの機能拡張(その2)

3 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 4: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様
Page 5: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

高い生産性で人気の言語Rubyの軽量版「mruby」 RAM200KB程度で動作

経済産業省「地域イノベーション創出研究開発事業」の 研究成果として2012年4月に 「mruby」を公開

商用利用しやすい MITライセンスのOSS

Rubyの良さを組込み開発に...

5 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

https://github.com/mruby/mruby にてソース公開

Page 6: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

require 'socket' begin sock = TCPSocket.open("192.168.1.1", 30000) 10.times { sock.write("Hello!!") } sock.close rescue => e p e end

#include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> int main(void) { 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; } 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) { puts("connect() failed."); exit(2); } for (i=0; i<10; i++) { if (send(sock, msg, strlen(msg), 0) != strlen(msg)) { puts("send() failed."); exit(3); } } close(sock); return 0; }

• 短いコード • 簡潔な記述 • ポインタ操作なし • メンテナンス性が高い

• コードが長くなりがち • 処理が複雑になりがち • 危険なポインタ操作 • メンテナンス性が低い

C言語 (35行)

Ruby (10行)

高い生産性(例:ソケット通信処理)

6 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 7: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby ≒ 軽量Ruby PC向けの(巨大な)Rubyを軽量化

仮想マシンとコンパイラ mruby用の仮想マシン(VM)でアプリ(バイトコード)を実行

C言語と相性バツグン Cモジュールの呼び出し、Cアプリへの組込み

高い拡張性 ライブラリ(mrbgem)で容易にmrubyの機能を拡張

組込み開発に使える新言語「mruby」

7 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 8: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby専用のコンパクトな仮想マシン「mruby VM」 バイトコードを実行(スクリプトよりコンパクトに)

軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様 Ruby 2.0系にも対応中

よりコンパクトに

8 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 9: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

環境依存させない mrubyコアのコードは環境依存部を含まない

VM外部への影響を少なく • グローバル変数を使用しない

• VM管理情報にmrubyアプリの全情報を格納

• インクリメンタルGCでシステム停止時間を短く

より多くの環境で使えるように

9 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 10: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

カスタマイズを容易に mrbconf.h … 実行環境に合わせて最適化が可能

機能拡張を容易に build_config.rb … mrubyに組み込む機能を定義 mrbgems … mrubyを拡張するクラスライブラリ

クロス開発を容易に build_config.rb … クロスビルド方法をスクリプトで記述 toolchain … クロスビルドツールを定義

より使いやすく

10 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 11: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

コンパイラ言語

C言語との主従関係

RubyGemsとmrbgems

数値型の扱い

正規表現

扱える文字コード

カスタマイズ

Rubyとの相違点

11 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 12: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

Ruby mruby • Rubyスクリプトのインタプリタ

実行。

• mrubyスクリプトのインタプリ

タ実行。

• mrubyコンパイラでmrubyスクリプトをバイナリに変換。 コンパイル結果のバイナリをmruby VMで実行。

コンパイラ言語

12 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 13: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

C言語との主従関係

13 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Ruby mruby • RubyからC言語モジュールの呼

び出しが可能 ( Rubyが主、C言語が従 )

• mrubyからC言語モジュールの呼

び出しが可能 ( mrubyが主、C言語が従 )

• C言語アプリケーションからmrubyの呼び出しが可能 ( C言語が主、mrubyが従 )

Page 14: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

RubyGemsとmrbgems

14 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Ruby mruby • Ruby拡張ライブラリフレーム

ワーク(RubyGems)

• C言語またはRubyで機能拡張

• 実行時にライブラリを追加

• mruby拡張ライブラリフレーム

ワーク(mrbgems)

• C言語またはmrubyで機能拡張

• ビルド時にライブラリを追加 ( 実行時のライブラリ追加はオプション )

Page 15: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

数値型の扱い (1)

15 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Ruby mruby Numeric +--- Integer 整数型 | +--- Fixnum int範囲内の数 | +--- Bignum int範囲を超える数 +--- Float 浮動小数型 • 演算結果がint型を超える場合は

Bignumに拡張される。

Numeric +--- Integer 整数型 | +--- Fixnum int範囲内の数 | Bignum対応なし +--- Float 浮動小数型 • 演算結果がint型を超える場合は

Floatに拡張される。 (有効桁数が減る)

Page 16: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

数値型の扱い (2)

16 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Ruby mruby • 演算結果の数値型は演算する値

の型 (Integer / Float)によって決定される。

• 演算結果の数値型は演算結果の

値によって決定される。

irb(main):001:0> 1 / 2 => 0 irb(main):002:0> 2 * 2.5 => 5.0 irb(main):003:0>

> 1 / 2 => 0.5 > 2 * 2.5 => 5 >

Page 17: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

正規表現

17 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Ruby mruby • 正規表現(Regexpクラス)を

標準装備

• 正規表現エンジンは固定 • 1.9以前 Oniguruma • 2.0以降 Onigumo

• 正規表現はオプション

※mrbgemsで提供

• 正規表現エンジンを選択可能 • mruby-onig-regexp • mruby-pcre-regexp • mruby-pure-regexp • mruby-hs-regexp

Page 18: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

扱える文字コード

18 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Ruby mruby • ASCII • UTF-8 • Shift_JIS • EUC-JP • Windows-31J などなど...

• ASCII • UTF-8 (オプション)

Page 19: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

カスタマイズ

19 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Ruby mruby • 実行環境用のバイナリを配布

(ソースコードも入手可能)

• バイナリ提供のためカスタマイズ不能

• ソースコード配布

(そのままでは使えない)

• ヘッダファイル、ビルドスクリプト修正によるカスタマイズが可能

Page 20: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様
Page 21: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

21 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Cコンパイラ・リンカ (gccなど)

GNU Bison (パーサジェネレータ)

Ruby (本家)

git (バージョン管理システム) ※必須ではないです

上記が動作するパソコン (Windows, Mac, Linux)

mrubyソースコード

mrubyのビルドに必要なもの

Page 22: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

22 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

以下の内容に従って、mrubyのビルドに必要なツールをセットアップします。

Windowsの場合 C:¥mruby-porting¥doc¥setup-mruby-devenv-win.html

Macの場合 ~/mruby-porting/doc/setup-mruby-devenv-mac.html

mrubyビルド環境の構築

Page 23: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

23 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

コマンド画面(Windows: msys.bat、Mac: ターミナル)を開き 以下のコマンドを入力

mrubyソースコードの取得・ビルド

$ cd /c/mruby-porting $ git clone https://github.com/mruby/mruby $ cd mruby $ make

Macの場合は cd ~/mruby-porting

Page 24: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby/ benchmark/ ベンチマーク bin/ mrubyバイナリ出力ディレクトリ build/ ビルド用ディレクトリ host/ PC用ビルド結果 doc/ mrubyドキュメント examples/ ビルドターゲットおよびmrbgemsの記述例 include/ mrubyヘッダファイル格納ディレクトリ lib/ mrubyビルドスクリプト格納ディレクトリ mrbgems/ 標準mrbgems格納ディレクトリ mrblib/ mrubyライブラリソースファイル(Rubyライブラリ) src/ mrubyソースファイル tasks/ ビルドタスクファイル test/ mrubyテストプログラム

24 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyソースコードの構成

Page 25: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

25 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

bin/mruby インタプリタ

bin/mirb 対話型インタプリタ

bin/mrbc コンパイラ

bin/mrdb デバッガ

build/host/lib/libmruby.a mruby VMライブラリ

mrubyのビルドで作られるもの

Page 26: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様
Page 27: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

27 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Rubyスクリプトを解釈して実行(本家Rubyと同様)

バイナリコード(MRBファイル)の実行も可能

開発環境での動作確認に利用

mrubyインタプリタ (mruby)

Page 28: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

switches -b バイナリ(MRB)ファイルの実行 -c 文法チェックのみ -e 'command' 1行スクリプトの実行 -v バージョン表示後、詳細モード実行 --verbose 詳細モードで実行 --version バージョン情報表示 --copyright 著作権情報表示

28 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

コマンド (mrubyインタプリタ) mruby [switches] file [arg1 [...]]

Page 29: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby-porting/src/02twice/twice.rb

mruby-porting/src/01hello/hello.rb

29 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Rubyスクリプトの実行

ary = [1, 21.0975, "mruby", [1, 4, 7]] ary.each do |v| p v * 2 end

p 'Hello, mruby.'

p は引数で指定した値の内容を画面表示するメソッド

[ ] で括られたものは配列(Array)

Array#eachは配列の要素を順番に繰り返すメソッド

' ' または " " で括られたものは文字列(String)

Page 30: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

30 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

対話形式でmrubyを実行(Interactive mruby)

CRubyの "irb" に相当

簡易的な動作確認には最適

対話型mrubyインタプリタ (mirb)

Page 31: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

switches -v バージョン表示後、詳細モード実行 --verbose 詳細モードで実行 --version バージョン情報表示 --copyright 著作権情報表示

31 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

コマンド (対話型mrubyインタプリタ) mirb [switches]

Page 32: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

32 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mirb実行例

"quit" または "exit" で終了

1行入力毎に実行結果(値)の確認が可能

Page 33: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

33 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Rubyスクリプトをバイトコードにコンパイル

コンパイル結果のファイル出力

バイナリファイル(MRBファイル)

C言語ソースファイル(バイナリデータのバイト配列)

デバッグ情報の出力

mrubyコンパイラ (mrbc)

Page 34: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

switches -c 文法チェックのみ -g デバッグ情報を生成 -o<outfile> コンパイル結果を<outfile>に出力 -v バージョン表示後、詳細モード実行 -B<symbol> Cソース(変数名:<symbol>)で出力 -e リトルエンディアンでコンパイル -E ビッグエンディアンでコンパイル --verbose 詳細モードで実行 --version バージョン情報表示 --copyright 著作権情報表示

34 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

コマンド (mrubyコンパイラ) mrbc [switches] file1 [file2 [...]]

Page 35: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

35 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

1. MRBファイル(-B オプション指定なし)

実行環境のファイルシステムに配置し、mruby VMにロードして実行

実行環境にファイルシステムが必要

2. Cソースファイル(-B オプション指定あり)

アプリケーションの一部としてバイナリコードを組み込み、メモリ上のバイナリをmruby VMに読み込ませて実行

ファイルシステムを持たない実行環境でも利用可能

2つのコンパイル結果出力形式

Page 36: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

36 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyコンパイラの実行例 (1)

$ mrbc hello.rb

Page 37: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

37 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyコンパイラの実行例 (2)

$ mrbc –Bappbin hello.rb

Page 38: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

38 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyの全てのコンポーネントを含むスタティックライブラリ

アプリケーションにスタティックリンクする(アプリケーションに組み込む)ことで、アプリケーションからmrubyを呼び出すことが可能

mruby VMライブラリ (libmruby.a)

アプリケーション

libmruby.a

mruby アプリケーション

mrubyの機能を呼び出すことが可能

Page 39: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

39 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

MRBファイルの実行イメージ

ライブラリ バイナリ 入力

mrb ファイル

バイナリ 出力 パーサ コード

ジェネレータ

mruby アプリ

OS / ミドルウェア

mruby VM

011011011011100000010001010111 0001101111

Ruby スクリプト

class Foo def foo p “foo” end end

mrb ファイル 011011011011100000010001010111 0001101111

mrubyコンパイラ

mrubyアプリケーション 実行環境 開発環境 コピー

既存C/C++アプリ

mruby VM

Page 40: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

40 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyアプリケーション例 (sample1.c) #include "mruby.h"

#include "mruby/dump.h"

#include <stdio.h>

int main(int argc, char *argv[])

{

mrb_state *mrb = mrb_open();

FILE *fp;

if ((fp = fopen(argv[1], "rb")) != NULL) {

mrb_load_irep_file(mrb, fp);

fclose(fp);

}

mrb_close(mrb);

return 0;

}

mrubyのAPIを使用する際に必要なヘッダファイル (mruby/includeをインクルードパスに含める)

mruby VMの初期化

MRBファイルの読み込み(バイトコード復元)とmruby VMの起動

mruby VM終了

mruby-porting/src/03app-mrb/sample1.c

Page 41: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

41 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyアプリケーションの作成 コマンド画面から以下のコマンドを入力

$ cd /c/mruby-porting/src/03app-mrb $ make $ ./sample1 hello.mrb $ ./sample1 twice.mrb

Macの場合は cd ~/mruby-porting

Page 42: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

42 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Makefileの内容 MRUBY=../../mruby

all:

make -C $(MRUBY)

$(MRUBY)/bin/mrbc -o./hello.mrb ../01hello/hello.rb

$(MRUBY)/bin/mrbc -o./twice.mrb ../02twice/twice.rb

gcc -osample1 sample1.c -I$(MRUBY)/include -L$(MRUBY)/build/host/lib -lmruby -lm

clean:

rm -f sample1 *.mrb

mrubyアプリのコンパイル

libmruby.aをリンクする

インクルードディレクトリを指定

Page 43: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

43 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mruby VMの初期化 (mrb_open) 関数型 mrb_state* mrb_open();

引数 なし

戻り値 mrb_state(VM情報)のポインタを返す。

機能概要 mruby VMの初期化処理を行う。 戻り値のmrb_stateのポインタは、他のmrubyのAPIを使用する際に必要となる。

備考 mruby VMの全ての情報はmrb_state構造体内に管理される。 そのため、基本的にはmrubyアプリケーションがmruby VMの外部に影響を及ぼすことはない。(ライブラリによる機能拡張で外部アクセスは可能) mrb_state構造体は "mruby.h" 内で定義されている。 また、mrubyのソースコード内では、mrb_state構造体のポインタを格納する変数名を mrb とすることが慣習となっている。

Page 44: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

44 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrb_state構造体 include/mruby.h にて定義

mruby VMの全ての情報を管理

有用なメンバ(クラスのインスタンス) object_class オブジェクトクラス module_class モジュールクラス string_class 文字列クラス array_class 配列クラス hash_class ハッシュテーブルクラス float_class 浮動小数点数クラス fixnum_class 整数クラス

Page 45: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

45 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

MRBファイルの実行 (mrb_load_irep_file) 関数型 mrb_value mrb_load_irep_file(mrb_state *mrb,

FILE *fp);

引数 mrb mrb_stateのポインタを指定する。

fp MRBバイナリのファイルポインタを指定する。

戻り値 バイトコードの実行結果(値は処理依存)を返す。

機能概要 MRBファイルを読み込み、mrubyプログラム(バイトコード)をメモリ上に復元した後にmruby VM上で実行する。 戻り値は、mrubyプログラムの処理結果により内容が異なる。

備考

Page 46: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

46 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mruby VMの終了 (mrb_close) 関数型 void mrb_close(mrb_state *mrb);

引数 mrb mrb_stateのポインタを指定する。

戻り値 なし

機能概要 mruby VMの終了処理を行う。 mruby VMおよびmrubyアプリケーションが使用したメモリ領域が解放される。

備考

Page 47: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

47 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyで使用する値 (mrb_value構造体) typedef struct mrb_value {

union {

mrb_float f;

void *p;

mrb_int i;

mrb_sym sym;

} value;

enum mrb_vtype tt;

} mrb_value;

+0 +1 +2 +3 +4 +5 +6 +7 +8

f TT

p 未使用 TT

i 未使用 TT

sym 未使用 TT

構造体に格納している値の型を示す。 <主な定義値> MRB_TT_FIXNUM 整数値 MRB_TT_SYMBOL シンボル MRB_TT_FLOAT 浮動小数値 MRB_TT_ARRAY 配列オブジェクト MRB_TT_STRING 文字列オブジェクト

Page 48: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

48 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyアプリケーション動作シーケンス

Page 49: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

49 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Cファイルの実行イメージ

ライブラリ バイナリ 入力

バイトコード (ROM上)

バイナリ 出力 パーサ コード

ジェネレータ

mruby アプリ

OS / ミドルウェア

mruby VM

Ruby スクリプト

class Foo def foo p “foo” end end

Cソース ファイル const uint8_t appbin[] = { 0x52, 0x49, 0x54, 0x45, ...

mrubyコンパイラ

mrubyアプリケーション 実行環境 開発環境 アプリケーションにリンク

既存C/C++アプリ

mruby VM

Page 50: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby-porting/src/04app-c/sample2.c

#include "mruby.h" #include "mruby/irep.h" int main(int argc, char *argv[]) { mrb_state *mrb = mrb_open(); extern uint8_t app1[], app2[]; mrb_load_irep(mrb, app1); mrb_load_irep(mrb, app2); mrb_close(mrb); return 0; }

バイナリデータ読み込み(バイトコード復元)

mrbc -B でのコンパイル結果であるバイナリデータの外部変数宣言

50 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyアプリケーション例 (sample2.c)

Page 51: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

51 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyアプリケーションの作成 コマンド画面から以下のコマンドを入力

$ cd /c/mruby-porting/src/04app-c $ make $ ./sample2

Macの場合は cd ~/mruby-porting

Page 52: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

52 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Makefileの内容 MRUBY=../../mruby

all:

make -C $(MRUBY)

$(MRUBY)/bin/mrbc -Bapp1 -o./hello.c ../01hello/hello.rb

$(MRUBY)/bin/mrbc -Bapp2 -o./twice.c ../02twice/twice.rb

gcc -osample2 sample2.c hello.c twice.c -I$(MRUBY)/include -L$(MRUBY)/build/host/lib -lmruby -lm

clean:

rm -f sample2 hello.c twice.c

mrubyアプリのコンパイル

libmruby.aをリンクする

インクルードディレクトリを指定

アプリケーションバイナリをリンク

Page 53: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

53 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

バイナリデータ読み込み/実行(mrb_load_irep) 関数型 mrb_value mrb_load_irep(mrb_state *mrb,

const uint8_t *bin);

引数 mrb mrb_stateのポインタを指定する。

bin バイナリデータの先頭アドレスを指定する。

戻り値 バイトコードの実行結果(値は処理依存)を返す。

機能概要 メモリ上に配置された(mrubyコンパイル結果の)バイナリデータをメモリ上に復元した後にmruby VM上で実行する。 戻り値は、mrubyプログラムの処理結果により内容が異なる。

備考

Page 54: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様
Page 55: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

55 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyライブラリ - mrbgem C言語またはmruby (Ruby) で作成されるライブラリ

ビルド時に組み込むことでmrubyを機能拡張

有志が作成したmrbgemを使用可能(280件超)

mrbgemの準備 (調達 or 作成)

mruby VMへのmrbgemの組み込み

mrbgemによるmruby拡張手順

Page 56: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

56 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgemの公開情報 公開されているmrbgemの一覧情報

https://github.com/mruby/mgem-list

mgemコマンドを使用して参照すると分かりやすい

mgemコマンドのインストール $ gem install mgem

Page 57: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

57 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mgemコマンドの利用 mrbgemの一覧表示

mrbgemの情報表示

mrbgemの検索

$ mgem list

$ mgem info <mrbgem-name>

$ mgem search <search-pattern>

Page 58: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

58 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

build_config.rbの編集 1. MRuby::Build.new ブロックの中に

conf.gem 'xxxx' の形式でmrbgems格納ディレクトリのパスを指定

2. GitHubで公開されているmrbgemを組み込むことも可能 conf.gem :git => 'xxxx'

MRuby::Build.new do |conf|

# ...

conf.gem 'mrbgems/GEM_NAME'

conf.gem :git => 'git://github.com/masuidrive/mrbgems-example.git'

# ...

end

ローカルドライブ上のmrbgemsの組込み

GitHubに公開されているmrbgemsの組込み

Page 59: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

1. mrbgemの情報取得

2. build_config.rbに追加

59 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgemの組み込み例 (mruby-sleep)

MRuby::Build.new do |conf|

conf.gem :git => 'https://github.com/matsumoto-r/mruby-sleep.git'

end

$ mgem info mruby-sleep

Detail information of 'mruby-sleep':

Name: mruby-sleep

Author: MATSUMOTO Ryosuke

Description: Sleep Module

Website: https://github.com/matsumoto-r/mruby-sleep

Repository: https://github.com/matsumoto-r/mruby-sleep.git

Repo Option:

Protocol: git

Page 60: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mrbgemを組み込んだmruby VMを作成 mrubyディレクトリ内で以下のコマンドを実行

mruby-sleepの動作確認

60 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyの再構築

$ make clean all

$ bin/mruby –e 'sleep 10'

Page 61: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mrbgemを組み込んだmruby VMを作成 mrubyディレクトリ内で以下のコマンドを実行

61 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgemの組み込み例 (その2)

$ cd /c/mruby-porting/src/05mrbgem $ make mruby all $ ./zip.rb 8100001 $ ./z2a 8100001

Macの場合は cd ~/mruby-porting

mrubyインタプリタで実行

mrubyアプリとして実行

Page 62: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

組み込んだmrbgem mruby-porting/src/05mrbgem/build_config_http.rb

62 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgemの組み込み例 (その2)

MRuby::Build.new do |conf|

conf.gem :core => 'mruby-pack' # Array#pack, String#unpack

conf.gem :core => 'mruby-io' # IO, File classes

conf.gem :core => 'mruby-socket' # Socket library

conf.gem :git => 'https://github.com/matsumoto-r/mruby-simplehttp.git'

# Simple HTTP client

conf.gem :git => 'https://github.com/mattn/mruby-json.git' # JSON library

end

mrubyにバンドルされているmrbgemを組み込む場合には、:core => の形式で指定する

Page 63: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby-porting/src/05mrbgems/Makefile

63 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgemの組み込み例 (その2)

MRUBY=../../mruby

all:

$(MRUBY)/bin/mrbc -o zip.c -Bappbin zip.rb

gcc -o z2a -I$(MRUBY)/include -L$(MRUBY)/build/host/lib z2a.c zip.c -lmruby -lm

mruby:

MRUBY_CONFIG=../src/05mrbgem/build_config_http.rb make -C$(MRUBY) clean all

clean:

rm zip.c z2a

build_config.rb の代わりに mrubyのビルドに使用する ビルド構成ファイルを指定

※ 相対パスで指定する場合は mrubyディレクトリ基準の相対パスとなる

Makefile

Page 64: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mrubyアプリケーション mruby-porting/src/05mrbgem/zip.rb

64 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgemの組み込み例 (その2)

#! ../../mruby/bin/mruby

begin

raise ArgumentError.new "Usage: #{$0} <zipcode>" if ARGV.empty?

raise ArgumentError.new 'Invalid ZIP code' unless ARGV.size > 0 && ARGV[0].size == 7

# ZIP SEARCH API SERVICE - http://api.thni.net/jzip/JSON/810/0001.js

c = SimpleHttp.new('http', 'api.thni.net')

res = c.get("/jzip/X0401/JSON/#{ARGV[0][0..2]}/#{ARGV[0][3..6]}.js")

raise "ZIP code (#{ARGV[0]}) is not found." if res['body'].include?('Not Found')

# "body" => '{"stateName":"福岡県", "city":"福岡市中央区", "street":"天神"}'

json = JSON::parse(res['body'])

puts json["stateName"] + json["city"] + json["street"]

rescue => e

puts e

end

Page 65: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

65 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgemの階層構造

凡例 赤字:必須 青字:任意

mruby/ mrbgems/ mrbgemsディレクトリ GEM_NAME/ GEMの名称(名称は任意) include/ C言語拡張関数定義 mrblib/ Ruby記述の拡張ソースコード src/ C言語記述の拡張ソースコード test/ テストコード(Ruby記述) mrbgem.rake GEM記述 README.md GEMのREADME

Page 66: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

66 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

GEM_NAME/mrbgem.rake の作成

MRuby::Gem::Specification.new('GEM_NAME') do |spec|

spec.license = 'MIT'

spec.author = 'mruby developers'

spec.summary = 'sample mrbgem'

end 著作者

ライセンス形態

mrbgem名

オプション 内容

spec.version バージョン情報

spec.description 詳細説明

spec.requirements 必要条件に関する説明文

spec.cflags Cコンパイラのオプションフラグ

spec.add_dependency mrbgemの依存関係追加

その他の主要なオプション mrbgemの概要

Page 67: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

Rubyコードの追加方式 GEM_NAME/mrblib にRubyソースファイルを配置

67 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mruby(Ruby)によるmruby VMの拡張

mruby(Ruby)によるmruby拡張例 mruby-porting/src/06mrbgem2/sample-mrbgem/mrblib/square.rb

class Fixnum

def square

self * self

end

end

整数を扱うFixnumクラスに squareメソッドを追加

Page 68: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

Cコードの追加方式 GEM_NAME/src にCソースファイルを配置

mruby拡張手順

1. mrubyから呼び出すC言語関数の定義

2. GEM初期化関数の定義

クラス/モジュールの登録(必要な場合)

クラス/モジュールへのメソッドの登録

3. GEM終了関数の定義

68 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Cによるmruby VMの拡張

Page 69: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

69 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Cによるmruby VMの拡張 mruby-porting/src/06mrbgem2/sample-mrbgem/src/neg.c

#include "mruby.h"

#include "mruby/value.h"

static mrb_value neg(mrb_state *mrb, mrb_value self)

{

return mrb_fixnum_value(-mrb_fixnum(self));

}

void mrb_sample_mrbgem_gem_init(mrb_state *mrb)

{

mrb_define_method(mrb, mrb->fixnum_class, "negative", neg, MRB_ARGS_NONE());

}

void mrb_sample_mrbgem_gem_final(mrb_state *mrb)

{

}

mrubyから呼び出すC言語関数

GEM終了関数(mrb_XXX_gem_final) (終了処理がなくても関数が必要)

GEM初期化関数(mrb_XXX_gem_init)

Cの関数neg()をmrubyのメソッド(Fixnumクラスのnegativeメソッド)として登録

mrbgem名に合わせる ※ '-'は'_' に変換 mrbgem名に合わせる ※ '-'は'_' に変換 mrbgem名に合わせる ※ '-'は'_' に変換

Page 70: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

70 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyから呼び出し可能なC関数の形式 関数型 mrb_value func(mrb_state *mrb, mrb_value self);

引数 mrb mrb_stateのポインタが渡される。

self メソッドのレシーバが渡される。

戻り値 メソッドの処理結果である戻り値をmrb_value型にて返却する。 (値は処理に依存) メソッドの機能として戻り値を返す必要がない場合も、何らかのmrb_value値を返す必要がある。

機能概要 mrubyプログラムから呼び出されるC関数は、本関数と同じ形式である必要がある。 C関数に渡される引数は、C関数内で mrb_get_args() を呼び出すことで取得することができる。

備考 関数名 (func) は任意の関数名を指定可能。

Page 71: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

71 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

メソッドの登録 (mrb_define_method) 関数型 void mrb_define_method(mrb_state *mrb,

struct RClass *c, const char *name, mrb_func_c func, int aspec);

引数 mrb mrb_stateのポインタが渡される。

c メソッドの登録対象となるクラス/モジュールのオブジェクトを指定する。

name mrubyプログラムから呼び出す際のメソッド名を指定する。

func 呼び出し対象のC言語関数を指定する。呼び出されるC関数は、以下の関数型である必要がある。 mrb_value func(mrb_state*, mrb_value);

aspec メソッドが受け取る引数を指定する。(次頁参照)

戻り値 なし

機能概要 クラス/モジュールにメソッドを定義する。

Page 72: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

72 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrb_define_methodのaspecに指定するマクロ MRB_ARGS_NONE() 引数なし

foo() MRB_ARGS_REQ(n) n個の必須の引数を持つ

foo(a, b, c) # => MRB_ARGS_REQ(3) MRB_ARGS_OPT(o) o個のオプション引数を持つ

foo(a=1, b=nil) # => MRB_ARGS_OPT(2) MRB_ARGS_ANY() 可変数の引数を持つ

foo(*args) MRB_ARGS_ARG(n, o) n個の必須引数、o個のオプション引数を持つ

ARGS_REQ(n) | ARGS_OPT(o) と同じ foo(a, b, c=1) # => MRB_ARGS_ARG(2, 1)

Page 73: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

73 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrb_valueを生成するAPI mrb_fixnum_value(i) 整数型のmrb_valueを生成する。

mrb_float_value(mrb, f) 浮動小数値のmrb_valueを生成する。

mrb_symbol_value(i) シンボル値のmrb_valueを生成する。

mrb_obj_value(p) オブジェクトの実体pを持つmrb_valueを生成する。

mrb_false_value() false値のmrb_valueを生成する。

mrb_true_value() true値のmrb_valueを生成する。

mrb_bool_value(boolean) 真偽値(true/false)のmrb_valueを生成する。

mrb_nil_value() nil値のmrb_valueを生成する。

Page 74: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

74 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrb_valueから値を取得するAPI mrb_fixnum(v)

mrb_valueの整数値を取得する。 (v).value.i

mrb_float(v) mrb_valueの浮動小数値を取得する。 (v).value.f

mrb_symbol(v) mrb_valueのシンボル値を取得する。 (v).value.sym

mrb_ptr(v) mrb_valueのオブジェクトポインタを取得する。 (v).value.p

Page 75: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby-porting/src/06mrbgem2/build_config_sample_mrbgem.rb

75 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgemの組み込み

MRuby::Build.new do |conf|

conf.gem '../../src/06mrbgem2/sample-mrbgem'

end

相対パスで指定する場合には mruby/mrbgems基準のパスとなる

$ cd /c/mruby-porting/src/06mrbgem2 $ make $ ../../mruby/bin/mirb > 100.square.negative => -10000

Macの場合は cd ~/mruby-porting 動作確認

Page 76: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

作成するmrbgem mruby-porting/src/07practice1/banker

Cで実装するもの

Bankerクラス

Banker#counter(n=2) メソッド n: 倍数 (デフォルト: 2) nが2の場合: "倍返しだ!" の文字列を返す nが2以外の場合: "#{n}倍返しだ!" の文字列を返す

76 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgem (banker) の作成

Page 77: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

77 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

実行例 $ cd /c/mruby-porting/src/07practice1 $ make $ ../../mruby/bin/mirb > hnzw = Banker.new => #<Banker:0x7fde3f001b70> > hnzw.counter(2) => 倍返しだ! > hnzw.counter(100) => 100倍返しだ! >

Macの場合は cd ~/mruby-porting

Page 78: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

78 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

クラスの登録 (mrb_define_class) 関数型 struct RClass *mrb_define_class(mrb_state *mrb,

const char *name, struct RClass *super);

引数 mrb mrb_stateのポインタを指定する。

name クラスの名称を指定する。

super 親クラスのクラスオブジェクトを指定する。

戻り値 定義されたクラスオブジェクトのポインタを返す。

機能概要 クラスを定義する。

備考 superには、以下に示すmrb_state構造体内に保持されている既存のクラスを指定することが可能。

mrb->object_class オブジェクトクラス mrb->array_class Arrayクラス mrb->string_class Stringクラス

Page 79: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

79 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

引数の取得 (mrb_get_args) 関数型 int mrb_get_args(mrb_state *mrb,

const char *format, ...);

引数 mrb mrb_stateのポインタを指定する。

format 次頁に示す文字で取得する引数の型を指定する。 (複数指定可能)

... formatで指定した可変数引数の値を受け取る変数のポインタを指定する。

戻り値 取得した引数の数を返す。

機能概要 メソッドに渡された引数を取得する。

備考

Page 80: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

80 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrb_get_argsのformat指定文字列とデータ型 format 取得する引数 引数を受け取る変数型

o オブジェクト(Object) mrb_value

S 文字列(String) mrb_value

s 文字列と文字長 char *, int

z 文字列(終端が'¥0') char *

A 配列(Array) mrb_value

a 配列と配列長 mrb_value *, int

f 浮動小数値 mrb_float

i 整数値 mrb_int

n シンボル値 mrb_sym

b 真偽値 mrb_bool

& ブロック mrb_value

* 残りの引数と引数の数 mrb_value *, int

| 後続はオプション引数 -

Page 81: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

81 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

文字列の生成 (mrb_str_new_cstr) 関数型 mrb_value mrb_str_new_cstr(mrb_state *mrb,

const char *p);

引数 mrb mrb_stateのポインタを指定する。

p 文字列('¥0' 終端) を指定する。

戻り値 Stringオブジェクトを返す。

機能概要 C言語文字列よりStringオブジェクトクラスを生成する。 Rubyで str = "C_STR" を実行することと等価。

備考

Page 82: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

82 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

ヒント:クラス定義の例 #include "mruby.h"

#include "mruby/value.h"

#include <stdio.h>

static mrb_value

surprise(mrb_state *mrb, mrb_value self)

{

mrb_int n, i;

mrb_value s = mrb_str_buf_new(mrb, 32);

mrb_get_args(mrb, "i", &n);

for (i=0; i<n; i++) mrb_str_cat_cstr(mrb, s, "じぇ");

return s;

}

void

mrb_ama_gem_init(mrb_state *mrb)

{

struct RClass *ama = mrb_define_class(mrb, "Ama", mrb->object_class);

mrb_define_method(mrb, ama, "!", surprise, MRB_ARGS_REQ(1));

}

Amaクラスを定義 (親クラスはObjectクラス)

Page 83: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

数値を文字列に変換するには sprintf() 関数を使用します。

使用例

83 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

ヒント:数値の文字列化

#include <stdio.h>

int main(void)

{

char buf[16];

int i;

for (i=0; i<10; i++) {

sprintf(buf, "%d回目", i);

puts(buf);

}

}

文字列を格納するために十分なサイズの領域を確保

Page 84: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様
Page 85: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mrubyのコアは環境依存しない 実行環境用のmruby VMを作成すればOK

アプリケーション (バイナリ) も環境依存しない 開発環境で動作したアプリは他のmruby VMでも動作可能

カスタマイズ可能なmruby VM 実行環境に合わせてチューニング

85 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

移植性の高いmruby

Page 86: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mrubyのクロスビルド ターゲット環境 (実行環境) 用のmruby VMを作成

mrubyのカスタマイズ mruby VMの構成、mrbgemの追加/削除

ターゲットアプリケーションへのmruby VMの組み込み アプリケーションからmruby APIを呼び出す

86 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyのポーティング手順(概要)

Page 87: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

87 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyアプリ実行形式の決定材料

実行形式 RAM容量 (目安) ○ ×

スクリプト 512KB〜 • 実行が容易 • アプリ更新も容易

• コンパイルにメモリと時間が必要

• スクリプトが丸見え

MRBファイル 192KB〜 • MRBファイルの差

し替えでアプリを更新できる

• ファイルシステムが必須

バイナリデータ (Cソース) 128KB〜 • サイズがコンパク

ト • アプリのみの更新が

難しい

Page 88: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mrubyでターゲットシステムを動かす

ターゲット依存するCモジュールの呼び出し OSのシステムコール、I/O制御処理など...

Cモジュール呼び出し部のライブラリ(mrbgem)化 Cの資産をmrubyの資産に!

88 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyのポーティング後に必要なこと

Page 89: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様
Page 90: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

MPU: RZ/A1H (Cortex-A9) 400MHz

Flash: 8MB

RAM: 16MB

Other: Arduino互換ピン、Ethernet、microSD、USB

RGB LED、mbed対応

90 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Renesas GR-PEACH

Page 91: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

91 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

GR-PEACH-Fullの外観 リセットボタン

USBポート (電源)

GPIO GPIO Vcc, GND, ...

RGB LED

Ethernetポート

Page 92: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

92 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

以下の内容に従って、mbed CLIの環境をセットアップします。

Windowsの場合 C:¥mruby-porting¥doc¥setup-mbed-cli-win.html

Macの場合 ~/mruby-porting/doc/setup-mbed-cli-mac.html

開発環境の構築

Page 93: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

93 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

サンプルアプリケーション mruby-porting/mbed/mbed-os-example-blinky/main.cpp #include "mbed.h" DigitalOut led1(LED1);

// main() runs in its own thread in the OS

int main() {

while (true) {

led1 = !led1;

wait(0.5);

}

}

Page 94: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

94 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

コンパイル手順 $ cd /c/mruby-porting/mbed/mbed-os-example-blinky $ mbed compile –m RZ_A1H –t GCC_ARM :

:

Text 46.7KB Data 2.32KB BSS 11.7KB ROM 49KB RAM 14KB

Image: .¥BUILD¥RZ_A1H¥GCC_ARM¥mbed-os-example-blinky.bin

Macの場合は cd ~/mruby-porting

アプリケーションを含むファームウェア

mbed-example-blinky は mbed サイトで公開されているLチカのサンプルアプリケーションです。 本来は以下のコマンドでサンプルコードをダウンロードしますが、時間短縮のためSDカードに収めています。 $ mbed import mbed-os-example-blinky #今回は実行不要です

GR-PEACH (MPU名) を指定

Page 95: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

ターゲットボード(GR-PEACH)をPCに接続する MBED ドライブがマウントされる

MBEDドライブのルートディレクトリに mbed-os-example-blinky.bin をコピーする しばらくするとMBEDドライブが再マウント され、binファイルは削除される

95 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

サンプルアプリケーションの実行

LEDが1秒周期で赤点滅すればOK

Page 96: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様
Page 97: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mrubyのクロスビルド ターゲット環境 (実行環境) 用のmruby VMを作成

mrubyのカスタマイズ mruby VMの構成、mrbgemの追加/削除

ターゲットアプリケーションへのmruby VMの組み込み アプリケーションからmruby APIを呼び出す

97 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyのポーティング手順

Page 98: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

方法1 ターゲットCPU向けのlibmruby.aを作成して、ターゲットアプリケーションにリンクする

方法2 ターゲットアプリケーションにmrubyのソースコードを追加して一緒にビルドする

98 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyのクロスビルド

Page 99: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

方法1 ターゲットCPU向けのlibmruby.aを作成して、ターゲットアプリケーションにリンクする

1. build_config.rbにクロスビルドのスクリプトを追加

2. mrubyをクロスビルド

3. 出力された mruby VM (libmruby.a) をターゲットアプリにリンク

99 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyのクロスビルド方法 (その1)

Page 100: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

方法2 ターゲットアプリケーションにmrubyのソースコードを追加して一緒にビルドする

1. build_config.rbにクロスビルドのスクリプトを追加

2. mrubyをクロスビルド (RubyのソースコードをC言語データ化)

3. mrubyのソースコードをターゲットアプリと一緒にビルド

100 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyのクロスビルド方法 (その2)

今回はこちらでやります!

ここまでは「方法1」と同じ

Page 101: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

$ cd /c/mruby-porting/mbed/mbed-os-example-blinky $ git clone https://github.com/mruby/mruby.git $ cd mruby $ git checkout 1.4.0

101 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

ターゲットアプリにmrubyソースを組み込む Macの場合は cd ~/mruby-porting

mrubyのバージョンを1.4.0に設定

Page 102: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby-porting/mbed/mbed-os-example-blinky/mruby/build_config.rb

102 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

クロスビルドの記述 (build_config.rb)

# 以下をファイルの最後に追加

# Cross build for GNUARM

MRuby::CrossBuild.new('mbed') do |conf|

toolchain :gcc

conf.cc {|cc|

cc.command = 'arm-none-eabi-gcc'

cc.flags << %w(

-mcpu=cortex-a9

-mthumb

-mfpu=fpv4-sp-d16

-mfloat-abi=softfp

)

}

conf.gem :core => 'mruby-print'

end

mruby-printを追加(動作確認用)

GNU ARM toolchainを使用

Page 103: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

103 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyのクロスビルド $ cd /c/mruby-porting/mbed/mbed-os-example-blinky/mruby $ make

Macの場合は cd ~/mruby-porting

mrubyクロスビルドの出力結果 mruby/ build/ host/ lib/ libmruby.a host-debug/ mbed/ lib/ libmruby.a host-debug/ test/

build_config.rb で追加した ターゲット用の mruby VM ※ただしこれは使わない!

開発環境(host環境)用の mruby VM

Page 104: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

104 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyの組み込み ターゲットアプリに組み込むmrubyソースコードの在処 mruby/ build/ mbed/ クロスビルドしたmrblib.c mrbgems/ gitで取得した外部のmrbgem (追加した場合のみ) include/ mrubyコアのヘッダファイル mrbgems/ mruby標準のmrbgem (必要なものだけを追加) src/ mrubyコアのソースコード

Page 105: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

IDE (eclipse, IAR Embedded Workbench等)を使用する場合 プロジェクトにソースファイルを追加

Makefileを使用する場合 ビルド対象にソースファイルを含める

mbed CLIを使用する場合 プロジェクト内にあるソースコードが自動で追加される

105 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyソースファイルの追加方法

Page 106: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

プロジェクトディレクトリ以下に含まれるファイルを自動で組み込む

Cソースファイル

C++ソースファイル

オブジェクトファイル(C/C++ファイルのコンパイル結果)

サブディレクトリ以下に含まれるファイルも自動で組み込む プロジェクトのファイル管理が不要!

106 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mbed CLIの仕様

これって便利???

Page 107: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

107 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mbed CLIでmrubyをビルドすると... mruby/ build/ mbed/ src/ array.o backtrace.o mrbgems/ mruby-bin-mirb/ mruby-bin-mrbc/ mruby-bin-mruby/ src/ array.c backtrace.c

それぞれにmain()関数が含まれる

*.cと同じ内容

リンクエラー(二重定義)が

発生

Page 108: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

.mbedignore を記述する

ビルド対象から除外するファイル/ディレクトリを指定

ワイルドカード(*, ? 等)が利用可能

ビルド対象から除外するもの

mrubyのビルドで生成されるオブジェクトファイル

main()関数を含むmrbgem

環境依存するmrbgem(mruby-io, mruby-socket, ...)

ユニットテストやサンプルソースコード

108 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mbed CLIでのmrubyリンクエラー対策

Page 109: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby-porting/mbed/mbed-os-example-blinky/.mbedignore

mruby/build/host/

mruby/build/host-debug/

mruby/build/test/

mruby/build/mbed/*/*.o

mruby/examples/

mruby/mrbgems/mruby-bin-*/

mruby/mrbgems/mruby-exit/

mruby/mrbgems/mruby-test/

mruby/mrbgems/mruby-io/

mruby/mrbgems/mruby-socket/

mruby/mrblib/

109 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

.mbedignore の記述例

mbed以外のビルドターゲットのビルド生成物は全て無視する

mbed用ビルドで生成されたオブジェクトファイルは無視し、mrubyバイナリ (Cソース)はビルド対象とする

main()を含む、または環境依存するmrbgemは無視する

行の最後が '/' の場合はディレクトリ指定、 '/' でない場合はファイル指定となる

Page 110: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

プロジェクトディレクトリ以下のディレクトリはインクルードディレクトリとなる

インクルードパスが自動で追加される(gcc –I で指定するイメージ)

パス指定なしで #include できる

110 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mbed CLIの仕様(その2)

これって便利???

Page 111: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby-porting/mbed/mbed-os-example-blinky/mruby/src/string.c #include <string.h> #include <mruby.h>

#include <mruby/array.h>

#include <mruby/class.h>

#include <mruby/string.h>

#include <mruby/range.h>

static mrb_value

mrb_str_getbyte(mrb_state *mrb, mrb_value str)

{

// 以下略

111 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

インクルードパス自動設定の弊害

mruby API関連のヘッダファイル

文字列関連機能のC標準ヘッダファイル

C標準のstring.hがインクルードされるべきところで、mruby/include/mruby/string.hがインクルードされてしまう

コンパイル エラーが発生

Page 112: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

.mbedignore を記述する?

ビルド対象から除外するディレクトリを指定 → 効果なし

ヘッダファイル名を変更する

標準ヘッダファイル名と一致するヘッダファイル名を使用しない

mruby/include/mruby/string.h を _string.h に変更

112 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mbed CLIでのmrubyコンパイルエラー対策

mrubyのソースコードを変更するため、メンテナンス性が犠牲に...

現状、他によい手段を思いつきません..orz

Page 113: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby/include/mruby/string.h のファイル名を _string.h に変更

mrubyソースコード中でインクルードしている箇所を変更 変更前 変更後

エディタの複数ファイル置換機能を使うと便利!

113 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

string.hのファイル名変更

#include <mruby/string.h>

#include <mruby/_string.h>

Page 114: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

114 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mbed CLIでmrubyをビルド

$ cd /c/mruby-porting/mbed/mbed-os-example-blinky $ mbed compile –m RZ_A1H –t GCC_ARM :

:

:

Image: .¥BUILD¥RZ_A1H¥GCC_ARM¥mbed-os-example-blinky.bin

Macの場合は cd ~/mruby-porting

Object file XXXX.o is not unique! の警告が多数表示されますが、binファイルが生成されればOK !!

Page 115: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mrubyのクロスビルド ターゲット環境 (実行環境) 用のmruby VMを作成

mrubyのカスタマイズ mruby VMの構成、mrbgemの追加/削除

ターゲットアプリケーションへのmruby VMの組み込み アプリケーションからmruby APIを呼び出す

115 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyのポーティング手順

Page 116: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby-porting/mbed/mbed-os-example-blinky/main.cpp

#include "mbed.h"

#include "mruby.h"

#include "mruby/proc.h"

DigitalOut led1(LED1);

// main() runs in its own thread in the OS

int main() {

mrb_state *mrb = mrb_open();

extern const uint8_t appbin[]; mrb_load_irep(mrb, appbin);

mrb_close(mrb);

while (true) {

led1 = !led1;

wait(0.5);

}

}

116 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mruby APIの呼び出し

Page 117: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

117 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mbed CLIでmrubyをビルド

$ cd /c/mruby-porting/mbed/mbed-os-example-blinky $ mruby/bin/mrbc –o app.c –Bappbin ../../src/01hello/hello.rb $ mbed compile –m RZ_A1H –t GCC_ARM :

:

Image: .¥BUILD¥RZ_A1H¥GCC_ARM¥mbed-os-example-blinky.bin

Macの場合は cd ~/mruby-porting

このファームウェアをGR-PEACH (MBEDドライブ) にコピー

Page 118: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

118 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

GR-PEACHにポーティングしたmrubyの動作確認

1. GR-PEACHをPCに接続した状態で以下を実行する Windowsの場合: CoolTermWin¥CoolTerm.exe を実行 Macの場合: LaunchPad より CoolTerm を実行

Page 119: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

119 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

GR-PEACHにポーティングしたmrubyの動作確認

2. Optionsから初期設定を行う(初回のみ)

Windowsの場合: COMx Macの場合: usbmodemXXXX

Page 120: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

120 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

GR-PEACHにポーティングしたmrubyの動作確認

3. CoolTermのConnectをクリック

4. GR-PEACHのmicroSDカードを抜いてRESETボタンを押下

"Hello, mruby!" と表示され、LEDが赤点滅すればOK

Page 121: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

mruby-porting/mbed/mbed-os-example-blinky/Makefile

TARGET = RZ_A1H

TOOLCHAIN = GCC_ARM

all:

MRUBY_CONFIG=../mbed_build_config.rb make -C mruby

mbed compile -m $(TARGET) -t $(TOOLCHAIN)

clean:

make -C mruby clean

rm -rf BUILD/$(TARGET)

注意

121 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

ビルドの効率化

空白(Space)ではなくタブ(Tab)を入力する必要がある

$ cd /c/mruby-porting/mbed/mbed-os-example-blinky $ cp mruby/build_config.rb mbed_build_config.rb

Macの場合は cd ~/mruby-porting

makeでビルドできます!

ユーザ定義のbuild_config.rbを指定

Page 122: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様
Page 123: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

123 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyポーティングと共に必要なこと mruby VMのカスタマイズ

メモリ使用量のチューニング

mrbgemの追加/削除

mrubyでターゲットシステムを動かす

ターゲット依存部をCモジュールから呼び出す OSのシステムコール、I/O制御など...

mrbgemを作る Cモジュールのライブラリ化による再利用性向上

RAM容量が厳しいターゲット環境ではポーティング前に実施

Page 124: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

124 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

演習8-1:mrbgemの追加 ポーティングしたmruby VMにmrbgem (Banker) を追加する

mruby/mrbgems にbankerをコピーする

mbed_build_config.rb を編集する

編集対象は mruby/build_config.rb ではない!

mrbgemを追加する場所に注意!

mrubyアプリ、mruby VMを差し替える

Bankerクラスを使ったmrubyアプリ(バイナリ)を組み込む

GR-PEACHのファームウェアを更新して、CoolTermで動作確認

Page 125: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

125 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrubyでターゲットシステムを動かす ターゲット依存部はCモジュール経由で呼び出す

OSのシステムコール、I/O制御など...

mrbgemを作る Cモジュールのライブラリ化による再利用性向上 ターゲット依存部をメソッド化できれば、残りはRubyでの実装も可能

Page 126: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

126 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgemの設計イメージ

mruby application mrbgem

Target module

(for mbed)

Target module (for PC)

ターゲット非依存部 ターゲット依存部

PC上でシミュレーション動作するSTUBモジュールを作るとクロス開発支援に繋がる

Page 127: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

127 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

以下のファイルを mbed-os-example-blinky にコピーする

C:¥mruby-porting¥src¥mbedapi¥

mbedapi.cpp ターゲットAPIの実装

mbedapi.h ターゲットAPI・定数の定義

ターゲットモジュール(サンプル)の取得

Macの場合は ~/mruby-porting/src/mbedapi/

Page 128: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

128 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

ターゲットモジュールのAPI一覧 API 機能概要

mbedDelay() 時間指定での処理停止

mbedMillis() システム時間の取得

mbedDigitalWrite() ディジタル出力

mbedDigitalRead() ディジタル入力

mbedI2CWrite() I2Cデバイスへのデータ書き込み

mbedI2CRead() I2Cデバイスからのでデータ読み込み

mbedI2CStart() I2C転送開始

mbedI2CStop() I2C転送終了

mbedInit() mbed APIの初期化

Page 129: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

129 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

演習8-2:システム時間機能の追加 ターゲットモジュール(mbedapi.cpp/h)を使用して、システム時間機能のためのmrbgemを作成する。

mrbgemの格納先ディレクトリは mruby/mrbgems/mruby-mbed とする。

C言語で実装するメソッド

Kernel#delay(ms) #=> nil ms(ミリ秒)で指定した時間、処理を停止する。 時間指定の処理停止には mbedDelay() を使用する。

Kernel#millis #=> Fixnum ミリ秒単位で取得したシステム時間(システム起動時からの経過時間)を返す。 システム時間の取得には mbedMillis() を使用する。

Page 130: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

130 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgem実装のためのヒント Kernelモジュールへのメソッド追加

mrb->kernel_module にメソッドを追加することで、Kernelモジュールへのメソッドが追加できる。

mrbgemの動作確認 delay(ms), millis とputs等の出力を組み合わせたmrubyアプリ(バイナリ)を組み込んでCoolTermで動作を確認する。

Page 131: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

131 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

時間指定での処理停止 (mbedDelay) 関数型 void mbedDelay(int ms);

引数 ms 処理停止する時間(ミリ秒)

戻り値 なし

機能概要 指定した時間、システムの処理を停止する。

備考

Page 132: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

132 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

システム時間の取得 (mbedMillis) 関数型 uint32_t mbedMillis(void);

引数 なし

戻り値 システム時間(ミリ秒)

機能概要 システムが起動してからの経過時間をミリ秒単位で取得する。

備考 システム時間のタイマを開始するためには、システム起動時に以下のいずれかの処理を行う必要がある。 • mbedInit() を呼び出す • 本関数(mbedMillis())を呼び出す

Page 133: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

133 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

演習8-3:ディジタル入出力機能の追加 mruby/mrbgems/mruby-mbed にディジタル入出力機能を追加する。

C言語で実装するメソッド

Kernel#digitalWrite(pin, val) #=> nil pinで指定されたGPIOピンに値(0 or 1)を出力する。 GPIOディジタル出力には mbedDigitalWrite () を使用する。

Kernel#digitalRead(pin) #=> Fixnum pinで指定したGPIOピンから入力した値(0 or 1)を返す。 GPIOディジタル入力には mbedDigitalRead() を使用する。

Page 134: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

134 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgem実装のためのヒント GPIOピン番号

GPIOのピン番号は mbedapi.h に定義されている以下が利用可能。

digitalWrite/digitalReadの動作確認 出力はLED、入力はユーザボタンを利用することで動作確認が可能。

定義名 値 備考

MBED_D0 〜 MBED_D13 0 〜 13 ディジタル入出力ピン

MBED_A0 〜 MBED_A5 16 〜 21 アナログ入力ピン

MBED_LED1 〜 MBED_LED4 22 〜 25 RGB LED(1〜3), 赤LED(4)

MBED_BUTTON1 26 ユーザボタン

Page 135: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

135 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

GR-PEACHのGPIOのピン番号

MBED_LED1 MBED_LED2 MBED_LED3

MBED_D0 : : MBED_D13

MBED_A0 : : MBED_A5

MBED_LED4

MBED_BUTTON1

Page 136: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

136 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

ディジタル入力 (mbedDigitalRead) 関数型 int mbedDigitalRead(int pin);

引数 pin GPIOピン番号 (MBED_xxx)

戻り値 ディジタル入力値 (0 or 1)

機能概要 pinで指定したGPIOピンから入力したディジタル値 (0 or 1) を返す。

備考 pinに指定するGPIOピン番号は mbedapi.h に定義している定義名 (MBED_xxx) または 値 (0〜23) が指定可能。

Page 137: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

137 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

ディジタル出力 (mbedDigitalWrite) 関数型 void mbedDigitalWrite(int pin, int value);

引数 pin GPIOピン番号 (MBED_xxx)

value 出力値 (0 or 1)

戻り値 なし

機能概要 pinで指定したGPIOピンにvalue (0 or 1) を出力する。

備考 pinに指定するGPIOピン番号は mbedapi.h に定義している定義名 (MBED_xxx) または 値 (0〜23) が指定可能。

Page 138: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

138 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

演習8-4:LEDクラスとGPIOピン定義の追加 mruby/mrbgems/mruby-mbed にLEDクラスとGPIOピン定義を追加する。

mrubyで実装するメソッド

LED.new(pin) #=> LED pinで指定されたGPIOピンのLEDオブジェクトを生成する。 LEDクラスのinitializeメソッドとして実装する。 ピン番号はインスタンス変数("@"付きの変数)で保持する。

LED#on / LED#off #=> nil LEDを点灯 / 消灯する。 LEDへのディジタル出力には Kernel#digitalWrite を使用する。

Page 139: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

139 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

演習8-4:LEDクラスとGPIOピン定義の追加 GPIOクラスの定数としてピン定義を追加する

GPIO::D0 〜 GPIO::D13

GPIO::A0 〜 GPIO::A5

GPIO::LED1 〜 GPIO::LED4

GPIO::BUTTON1

クラス定数の定義例(最もベタな方式)

class GPIO

D0 = 0

D1 = 1

D2 = 2

# 以下略

end

Page 140: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

140 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

演習8-5:I2Cクラスの追加 mruby/mrbgems/mruby-mbed にI2Cクラスを追加する。

実装するメソッド

I2C.new(addr) #=> I2C addrで指定したI2Cデバイスを制御するためのI2Cオブジェクトを生成する。 I2Cクラスのinitializeメソッドとして実装する。 addr (デバイスアドレス) はインスタンス変数("@"付きの変数)で保持する。

I2C#write(reg, val) #=> nil I2Cデバイスに対してデータ送信する。 regで指定された数値およびvalで指定された数値配列をバイトデータ列に変換してI2Cデバイスに送信する。 I2Cへの出力には mbedI2CWrite() を使用する。

Page 141: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

141 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

演習8-5:I2Cクラスの追加 実装するメソッド(続き)

I2C#read(reg, length) #=> Array I2Cデバイスからデータ入力する。 regで指定された数値をI2Cデバイスに送信し、lengthで指定したサイズのバイトデータ列を受信する。 受信したバイトデータ列を数値配列として返す。 I2Cからの入力には mbedI2CRead() を使用する。

I2C#_start / I2C#_end #=> nil I2C通信の開始 / 終了を指示する。 mbedI2CStart() / mbedI2CEnd() を使用する。

Page 142: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

142 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgem実装のためのヒント C言語実装部とmruby実装部に分ける

ターゲットモジュール (mbedapi.cpp/h) を呼び出す部分は C言語で実装する必要があるが、それ以外はmrubyで実装可能可能。 mruby実装部をうまく組み合わせると実装が容易になる。

バイトデータ列の扱い方 Rubyでの配列はArrayオブジェクトとして扱われる。 Arrayの要素はどんなオブジェクトでもよいが、本演習では整数値(Fixnum)の配列とすると扱いやすい。 ArrayクラスのC APIは mruby/include/mruby/array.h に定義されている。

Page 143: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

143 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

mrbgem実装のためのヒント(続き) I2Cクラスの動作確認

I2Cクラス単体では動作確認が困難なため、温度センサ (ADT7410) を使用して動作確認を行う。 ADT7410クラスのソースコードは以下から取得できる。 https://goo.gl/bb269R ※大文字小文字区別あり

Page 144: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

144 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

I2Cデバイスデータ書き込み (mbedI2CWrite) 関数型 int mbedI2CWrite(int addr, const char *cmd,

int length, uint8_t repeat);

引数 addr 送信先I2Cデバイスアドレス

cmd 送信コマンドの先頭アドレス

length 送信コマンドデータ長

repeat 未使用 (0を指定する)

戻り値 なし

機能概要 指定されたデバイスアドレスのI2Cデバイスに指定されたデータ長のコマンドデータを送信する。

備考

Page 145: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

145 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

I2Cデバイスデータ読み込み (mbedI2CRead) 関数型 int mbedI2CRead(int addr, char *data,

int length);

引数 addr 受信元I2Cデバイスアドレス

data 受信データ格納領域の先頭アドレス

length 受信データ長(受信データ格納領域のサイズ)

戻り値 0 受信完了

0以外 受信データなし

機能概要 指定されたデバイスアドレスのI2Cデバイスから、指定されたデータ長のデータを受信する。

備考 受信データがない場合には0以外の値が返されるため、受信完了するまで待つ場合には、戻り値が0になるまで本関数を呼び続ける必要がある。

Page 146: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

146 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

I2C転送開始 (mbedI2CStart) 関数型 void mbedI2CStart(void);

引数 なし

戻り値 なし

機能概要 I2C通信を開始する。

備考

Page 147: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

147 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

I2C転送終了 (mbedI2CStop) 関数型 void mbedI2CStop(void);

引数 なし

戻り値 なし

機能概要 I2C通信を終了する。

備考

Page 148: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

148 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

温度センサ ADT7410

アナログ・デバイセズ社製

温度精度: ±0.5℃ -40.0℃〜105℃

分解能: 0.0625℃ (13bitモード) 0.0078℃ (16bitモード)

I2C互換インタフェース

Page 149: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

149 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

ADT7410をGR-PEACHに繋ぐ

回路図

8 7 6 5 4 3 2 1

Page 150: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様
Page 151: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

組込みアプリケーションに組み込める • C/C++と戦わなくても組込みアプリが作れる

• C/C++モジュールが呼び出せるので安心

• C/C++で苦手な処理はmrubyで書けば簡単に実現

アプリケーションに組み込める • アプリケーションをmrubyで機能拡張

• アプリケーションをRubyスクリプトで制御したり...

• DSLっぽく使ってアプリの構成を記述したり...

色々なところに組み込める「mruby」

151 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 152: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

まずはmruby VMをマイコンで動作させる • RAMはどれくらい使えるのか...

• ターゲットCアプリへの組み込みはどうするか...

• mrubyアプリをどう動かすか...

mruby VMが動いた後はmrbgemを整備 • まずは公開mrbgemが利用可能かを確認

• 公開mrbgemがターゲット未対応であれば移植にチャレンジ

• 公開されていない場合は頑張って自作

組込み環境でmrubyを動かす

152 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

Page 153: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

153 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.

GR-PEACHで動くmruby – “momo-mruby”

GR-PEACH

https://github.com/mimaki/momo-mruby https://github.com/mimaki/momo-mruby-bin • mruby-1.3.0搭載 • mruby IoT framework – Plato 対応

秋月電子通商などで購入可

Page 154: Mruby基本研修バイトコードを実行(スクリプトよりコンパクトに) 軽量化してもRubyであるべき ISO, JIS規格のRuby(1.9系)に準ずる言語仕様

154 Copyright(C) 2018 mruby Forum, SCSK KYUSHU CORP.