Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
mruby IoT framework ‘Plato’とmruby IoT framework ‘Plato’とmrubyのポーティング研修テキストmrubyのポーティング研修テキスト
特定非営利活動法⼈軽量Rubyフォーラム
1
特定非営利活動法⼈軽量Rubyフォーラム
本研修について
• mruby概要
• mruby IoTフレームワーク “Plato”
• mrubyポーティングmrubyポーティング
• mrubyポーティング環境へのPlatoの適用• mrubyポーティング環境へのPlatoの適用
2
mruby概要mruby概要
“Ruby”を省リソース化した“mruby”の概要・特徴
“Ruby”を省リソース化した“mruby”の概要・特徴
3
mrubyとは
• 高い生産性で人気の言語Rubyの軽量版「mruby」「mruby」
– RAMサイズ200KB程度で動作可能
– 組込み機器にも搭載可能– 組込み機器にも搭載可能
• 経済産業省「地域イノベーション創出研究開発• 経済産業省「地域イノベーション創出研究開発事業」の研究成果として2012年4月に「mruby」を公開事業」の研究成果として2012年4月に「mruby」を公開
• 商⽤利⽤しやすいMITライセンスのOSS
http://github.com/mruby/mrubyMITライセンスのOSS
4
http://github.com/mruby/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 => ep e
end
int sock;int i;struct sockaddr_in svaddr;const char msg[] = "Hello!!";
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TC P)) < 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;
}
• コードが長くなりがち
• 処理が複雑になりがち
• 危険なポインタ操作
• メンテナンス性が低い
5
}
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 ...
• C/C++言語との高い親和性–組込みシステムの資産が再利⽤可能–組込みシステムの資産が再利⽤可能– アプリケーションにmrubyを組込み可能 6
補足: RubyとmrubyRuby mruby
インタプリタ言語 インタプリタ言語/コンパイラ言語
C言語モジュールの呼び出しが可能 C言語モジュールの呼び出し、C言語からC言語モジュールの呼び出しが可能 C言語モジュールの呼び出し、C言語からの呼び出しが可能
実行時にRubyGemsで機能拡張が可能 ビルド時にmrbgemsで機能拡張が可能実行時にRubyGemsで機能拡張が可能 ビルド時にmrbgemsで機能拡張が可能※mrbgemsとRubyGemsとは互換性なし
Integer同士の演算 → Integer
Float同士の演算 → Float
演算結果が整数値→Integer
演算結果が浮動小数値→FloatFloat同士の演算 → Float 演算結果が浮動小数値→Float
非常に大きな整数値はBignumで扱われる
非常に大きな整数値はFloatで扱われる
正規表現を標準装備 正規表現はオプション正規表現を標準装備 正規表現はオプション※複数から選択可能
ASCII, Shift_JIS, UTF-8など様々な文字 文字コードはASCII, UTF-8のみ利用可能ASCII, Shift_JIS, UTF-8
コードが利用可能ASCII, UTF-8
※UTF-8はオプション
バイナリ配布(ソースコードも入手可) ソースコード配布※容易にカスタマイズ可能※容易にカスタマイズ可能
7
mrubyを支えるコミュニティ
• オープンソースコミュニティ– 3,700人超のフォロワー オープンソース– 3,700人超のフォロワー– 200人以上のコントリビュータ– 7,700件を超える改良・修正
・
オープンソースとして成⻑
・Creative・Powerful
– 7,700件を超える改良・修正
https://github.com/mruby/mruby (mruby公開サイト)
• NPO軽量Rubyフォーラム– ワーキンググループによる活動– ワーキンググループによる活動– セミナー・講演会等での広報活動福岡県からの支援
会員企業による商業ベースでの利⽤
推進・実用化– 福岡県からの支援 ・ビジネス利⽤ノウハウ
推進・実用化・ビジネス利⽤ノウハウ
http://forum.mruby.org (軽量Rubyフォーラムサイト)
会員募集中 !!8
会員募集中 !!
IoT/M2M時代の新言語 - mruby
� ものとインターネット、ものとものが繋がる
→ 全てのものがネットワークに繋がっていく→ 全てのものがネットワークに繋がっていく
� 組込み分野もフロンティア領域を重点分野として新しい市場が形成されて
いく
→ これに対応した組込み開発が必須になっていく→ これに対応した組込み開発が必須になっていく
9
経済産業省
組込み開発の今後 資料より
PlatoPlato- mruby IoT framework -
mruby IoTフレームワーク “Plato”の概要mruby IoTフレームワーク “Plato”の概要
10
mruby IoT framework “Plato”
Plato (仮) - mruby IoT framework
• NEDO助成事業「組込みシステムの⾼効率開発を可能とする開発• NEDO助成事業「組込みシステムの⾼効率開発を可能とする開発フレームワークの研究開発」にて開発中(〜2017/2)(九州工業大学、有明工業高等専門学校、SCSK九州)(九州工業大学、有明工業高等専門学校、SCSK九州)
• mrubyによるIoT製品開発の効率化• マイコンボードとシームレスに繋がる統合開発環境の提供• マイコンボードとシームレスに繋がる統合開発環境の提供• 組込み向けセキュリティ機能の提供
White-Tiger
11
White-Tiger
センサボード Plato IDE
“Plato”で出来ること
mrubyによるIoT製品開発の効率化
• 組込み向けデバイスクラスライブラリの提供• 組込み向けデバイスクラスライブラリの提供
• BLE、WiFi、ZigBeeなど様々な通信方式にも対応BLE、WiFi、ZigBeeなど様々な通信方式にも対応
• 典型的なアプリケーションの雛形を自動生成(Railsのように)(Railsのように)
• シミュレータによるPC上でのシミュレーション
12
“Plato”で出来ること
mrubyボード(enzi) + センサボード(White-Tiger)
• 汎用IO• 汎用IO• デジタル/アナログIO、UART、I2C、SPI
• センサ• センサ• 温度、湿度、照度
• 通信デバイス• BLE• Wi-Fi• Wi-Fi• ZigBee• Ethernet
• ファイルシステム
• RTC
13
• RTC
“Plato”で出来ること
Plato IDE
• Visual Studio Codeベースの開発環境• Visual Studio Codeベースの開発環境(マルチ環境に対応)
• アプリ構成、使用ライブラリをGUIで指定• アプリ構成、使用ライブラリをGUIで指定
• アプリケーションのコンパイル• アプリケーションのコンパイル
• アプリケーションのシミュレーション実⾏
• マイコンへのプログラム書き込み
14
“Plato”で出来ること
セキュリティ機能 “Plato Guard”
IoT時代に必要となるセキュリティ機能をオプションで提供IoT時代に必要となるセキュリティ機能をオプションで提供
• 認証機能による不正アプリケーション実⾏の防⽌
(外部からの攻撃、乗っ取りから守る)認証機能による不正アプリケーション実⾏の防⽌
(外部からの攻撃、乗っ取りから守る)
• 暗号化による実⾏モジュール秘匿化• 暗号化による実⾏モジュール秘匿化
(アプリケーション資産の漏洩を防ぐ)
15
“Plato”が目指すところ
○rduinoよりも簡単に組込み開発を
• mruby(Ruby)でプログラミングできる• mruby(Ruby)でプログラミングできる
• 多くのマイコンボードに対応(バイトコード互換)多くのマイコンボードに対応(バイトコード互換)
• 必要なデバイスに応じてVMをカスタマイズできる• 必要なデバイスに応じてVMをカスタマイズできる
• mruby/cにも対応予定(⼩サイズ、省電⼒)(⼩サイズ、省電⼒)
16
mrubyポーティングmrubyポーティング
マイコンボードへのmruby適用マイコンボードへのmruby適用
17
mrubyポーティング
mrubyポーティングのために必要なこと
• mrubyビルド環境の構築• mrubyビルド環境の構築
• mrubyのクロスビルドmrubyのクロスビルド
• ターゲットアプリへのmruby組込み
18
mrubyビルド環境の構築
mrubyビルド環境の構築
以下の環境を準備する。以下の環境を準備する。
• 開発OS• Microsoft Windows
開発OS• Microsoft Windows• Mac� これら以外のOSも利⽤可能であるが、本書ではこれら2つに� これら以外のOSも利⽤可能であるが、本書ではこれら2つに
限定して紹介する。
• 本家Ruby• 本家Ruby• Cコンパイラ• GNU Bison• git• git
19
mrubyビルド環境の構築
本家Rubyの導入
Windowsの場合• 下記サイトよりRubyInstallerをダウンロードし、最新版のRuby
環境インストールする。(Ruby 2.0以降を推奨)環境インストールする。(Ruby 2.0以降を推奨)https://rubyinstaller.org/
Macの場合• Mac OSにプリインストールされているRubyが利⽤可能。• Mac OSにプリインストールされているRubyが利⽤可能。
20
mrubyビルド環境の構築
Cコンパイラの導入
Windowsの場合• Cコンパイラを含むC言語開発環境をインストールする。利⽤可能なC⾔語開発環境の⼀例利⽤可能なC⾔語開発環境の⼀例• Microsoft Visual Studio• gcc (MinGW)• gcc (Cygwin)• gcc (Cygwin)
Macの場合Macの場合• X Code および Command Line Toolsをインストールする。
21
mrubyビルド環境の構築
GNU Bisonの導入
Windowsの場合• 下記サイトよりBisonのインストーラをダウンロードしセット
アップする。アップする。http://gnuwin32.sourceforge.net/packages/bison.htm
Macの場合Macの場合• 以下のコマンドを実⾏してBisonをインストールする。
brew install bisonbrew install bison
22
mrubyビルド環境の構築
gitの導入
Windowsの場合• 下記サイトよりgit for Windowsのインストーラをダウンロード
しセットアップする。しセットアップする。https://git-for-windows.github.io/
Macの場合Macの場合• 以下のコマンドを実⾏してgitをインストールする。
brew install gitbrew install git
23
mrubyビルド環境の構築
mrubyのビルド
1. mrubyソースコードの入手とビルド1. mrubyソースコードの入手とビルド以下のコマンドを実⾏し、mrubyソースコードを入手し、ビルドする。ドする。
cd <任意のディレクトリ>git clone https://github.com/mruby/mrubygit clone https://github.com/mruby/mrubycd mrubymake
2. 以下のコマンドを実⾏し、mrubyのバージョン情報が表示されれば正しくビルドされている。
cd bin./mruby --version (Windowsの場合は ./ は不要)
24
mrubyのクロスビルド
mrubyクロスビルドで必要な作業
• ターゲットボード用ツールチェインの入手• ターゲットボード用ツールチェインの入手
• ビルドスクリプトの記述ビルドスクリプトの記述
25
mrubyのクロスビルド
ターゲットボード用ツールチェインの入手
ターゲットボード向けのソフトウェア開発に必要なツールチェインターゲットボード向けのソフトウェア開発に必要なツールチェイン(コンパイラ・リンカなどのセット)をセットアップする。
例えば、ARMプロセッサ⽤であれば以下のツールチェインが利⽤可例えば、ARMプロセッサ⽤であれば以下のツールチェインが利⽤可能。
GNU ARM Embedded Toolchainhttps://launchpad.net/gcc-arm-embedded
26
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/testMRuby::Build.new(’bench') do |conf|
end
MRuby:: CrossBuild.new ( ' hoge ') do | conf |
build/test
build/bench
追加するターゲット用のクロスビルド構成
27
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 = []
conf.gem :core => 'mruby-print'conf.gem :git => ‘https://github.com/mattn/mruby-json .git'# 省略
end
使用するmrbgems(ライブラリ)
使用するツールチェインの定義は、tasks/toolchain内に定義することで再利⽤が可能となる。
28
とで再利⽤が可能となる。
詳細は mrubyのドキュメントを参照のこと。
mrubyのクロスビルド
クロスビルド実⾏
build_config.rbへのクロスビルド定義の追加が終わったら、mrubybuild_config.rbへのクロスビルド定義の追加が終わったら、mrubyをリビルドすることでmrubyのクロスビルドが実施される。
cd mrubycd mrubymake clean all
ターゲット名を ‘hoge’ とした場合は、クロスビルドによって、以下のmrubyスタティックライブラリが生成される。
mruby/build/hoge/lib/libmruby.a
29
mrubyのクロスビルド
ターゲットアプリへのmruby組込み
クロスビルドで作成した libmruby.a をターゲットアプリケーショクロスビルドで作成した libmruby.a をターゲットアプリケーションにスタティックリンクすることで、ターゲットアプリケーションにmrubyを組み込むことができる。にmrubyを組み込むことができる。
ターゲットアプリケーションからmrubyを呼び出すためにはmrubyのC APIを使用する。mrubyのC APIを使用する。
ターゲットアプリケーションからのmrubyの呼び出し例を以下に⽰す。す。
30
mrubyのクロスビルド
ターゲットアプリへのmruby組込み
ターゲットアプリ(main.c)とC言語側から呼び出すmrubyアプリターゲットアプリ(main.c)とC言語側から呼び出すmrubyアプリ(app.rb)の例を以下に⽰す。
main.cmain.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の終了
31
“Hello, mruby!“
mrubyのクロスビルド
ターゲットアプリへのmruby組込み
以下のコマンドでmrubyアプリケーションをコンパイルする。以下のコマンドでmrubyアプリケーションをコンパイルする。
mrbc –Bappbin –o app.c app.rbmrbc –Bappbin –o app.c app.rb
main.c、上記コンパイル結果(app.c)をコンパイルし、前述のlibmruby.a と共にリンクすることで、mrubyを追加したターゲッlibmruby.a と共にリンクすることで、mrubyを追加したターゲットアプリケーションが完成する。
ターゲットボード上で実⾏し、ターミナルソフトなどでターゲットボード上で実⾏し、ターミナルソフトなどで
Hello, mruby!
の表示を確認することで、mrubyの動作を確認できる。
32
mrubyポーティング環境へのmrubyポーティング環境へのPlato適用Plato適用
マイコンボード向けPlatoカスタマイズマイコンボード向けPlatoカスタマイズ
33
mrubyポーティング環境へのPlato適用
Platoのボード対応に必要なこと
mruby IoT framework – Plato を新たなターゲットボードに対応mruby IoT framework – Plato を新たなターゲットボードに対応させるためには以下が必要となる。
• Plato IDEへのターゲットボード登録• Plato IDEへのターゲットボード登録
• デバイスI/F層ライブラリの実装• デバイスI/F層ライブラリの実装
34
mrubyポーティング環境へのPlato適用
Plato IDEへのターゲットボード登録
Plato IDEにターゲットボードを追加するには、以下の情報が必要とPlato IDEにターゲットボードを追加するには、以下の情報が必要となる。
• ターゲットボード名• ターゲットボードID
ターゲットボード名• ターゲットボードID
ターゲットボードIDはライブラリの識別⼦としても使⽤されるため、ターゲットボードIDはライブラリの識別⼦としても使⽤されるため、一意な名称を指定する必要がある。
35
mrubyポーティング環境へのPlato適用
デバイスI/F層ライブラリの実装
Platoが提供するライブラリ群はmrubyライブラリ(mrbgems)形式Platoが提供するライブラリ群はmrubyライブラリ(mrbgems)形式で実装されている。Plato提供ライブラリ群のうち、デバイスI/F層のライブラリは動作環境毎に提供される。Plato提供ライブラリ群のうち、デバイスI/F層のライブラリは動作環境毎に提供される。ターゲットボードを追加する場合には、ターゲットボードのデバイスI/F層ライブラリを実装・提供する必要がある。スI/F層ライブラリを実装・提供する必要がある。
提供するライブラリは以下の命名規則に従う必要がある。
mruby-plato-XXXXX-<デバイスID>
Platoアプリケーションでライブラリ “mruby-plato-XXXXX” を使Platoアプリケーションでライブラリ “mruby-plato-XXXXX” を使用する場合に、デバイスIDを名称に付加したターゲットボード用のライブラリ “mruby-plato-XXXXX-<デバイスID>” が自動的に追加登録される。
36
登録される。
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ライブラリ
37
応じて実装すれば良い。
mrubyポーティング環境へのPlato適用
デバイスI/F層ライブラリのPlatoへの登録
作成したデバイスI/F層ライブラリをPlatoに登録するには、ライブ作成したデバイスI/F層ライブラリをPlatoに登録するには、ライブラリリストファイルを作成する必要がある。ライブラリリストファイルは以下に示すようなJSON形式で記述し、ライブラリリストファイルは以下に示すようなJSON形式で記述し、ファイル名を mgem-<デバイスID>.lst とする必要がある。
ライブラリリストファイルの例 (mgem-hoge.lst)ライブラリリストファイルの例 (mgem-hoge.lst)
{ mrbgems: [
{ “name”: “mruby-plato-machine-hoge”,
“descriptrion”: “PlatoHoge::Machine class”,“descriptrion”: “PlatoHoge::Machine class”,
“author”: “mruby developers”,
“license: “MIT”,
“repository”: “https://github.com/hoge/mruby-plato-machine-hoge”,“repository”: “https://github.com/hoge/mruby-plato-machine-hoge”,
”dependencies”: [
{“name”: “mruby-plato-machine”}
]
38
]
]}
mruby & Platomruby & Plato
まとめまとめ
39
Platoに出来ること
• mrubyアプリケーションが簡単に作れる
• アプリケーションの形式、使用するライブラリ• アプリケーションの形式、使用するライブラリ等を詳細に設定可能
• ビルド・プログラム転送可能なIDE• ビルド・プログラム転送可能なIDE
• IoTサービスとの連携
• シミュレーション実⾏• シミュレーション実⾏
40
まとめ
組込みで使える新言語「mruby」
• Rubyらしさはそのままに軽量化• Rubyらしさはそのままに軽量化
• 色々なところに組み込める
• C/C++と戦わなくても組込みアプリが作れる• C/C++と戦わなくても組込みアプリが作れる
mruby IoTフレームワーク Plato
• 簡単に素早くアプリ作成• 簡単に素早くアプリ作成
• アイデアさえあればアプリ開発可能
• IoT/M2Mのプロトタイピングが可能• IoT/M2Mのプロトタイピングが可能
41
http://plato.clickhttp://plato.click
おつかれさまでした
42