Skip to content
Ko-ichiro Sugiyama edited this page May 16, 2022 · 13 revisions

Welcome to the mrubyc-esp32 wiki!

mruby/c による開発の基礎

Ruby シリーズ

  • Ruby

    • 元祖. サーバ, PC 向け
  • mruby

    • マイコン, 組み込み向け
    • 2010年~2012年 経済産業省地域イノベーション創出研究開発事業で mruby を開発(ネットワーク応用通信研究所,福岡CSK,九州工業大学)
      • 現在は, まつもとゆきひろ氏が主にメンテナンス
    • Ruby を軽量化した実装 (実行時に必要なメモリ量 200 kb)
      • 実行時の消費メモリが少ない
    • 文法はRubyと同じ
  • mruby/c

    • 小規模マイコン, 組み込み向け
    • 2015年~ しまねソフト研究開発センター, 九州工業大学との共同研究でmruby/cを開発
    • mruby よりさらに小さな実装 (実行時に必要なメモリ量 < 64 kb)
      • RAM 削減を優先 (実行速度を捨てて)
    • 文法はRubyと同じ
      • 利用頻度が低いメソッドは実装していない
    • OS なしでも複数の Ruby プログラムを動かせる

本リポジトリは小規模マイコン ESP32 をターゲットにしているため, 必然的に mruby/c を利用している.

mruby/c

mruby/c は以下の github リポジトリで公開されている.https://github.com/mrubyc/mrubyc

mruby/c の文法

Ruby の基本的な文法はそのまま使えると思って良い.

mruby/c の処理系

Ruby はインタプリタ型言語である. Ruby 1.8 までは, 行あるいは ブロック単位でプログラムが逐次機械語プログラムに変換されながら実行されていた. Ruby 1.9 以降は, Java と同様に, ソースコードをバイトコード (中間コード) にコンパイルし, それを仮想マシン (Virtual Machine; VM) で実行するような処理の流れになっている. 当然ながら mruby や mruby/c も基本的に同じような処理系になっている.

仮想マシンが独立しているので, コンパイルまでの複雑な処理と仮想マシンの実行環境を 別々にすることができる. mruby/c では, 以下のように処理をパソコンとマイコンに分ける.

  • Rubyプログラムをバイトコードにコンパイル →パソコンで行う
  • VM (Virtual machine) を使って実行 →マイコンで行う image

mruby/c では Parser と Code Generator の部分 (mrbc コマンド) は mruby の実装をそのまま使用し, VM だけ独自のコンパクトな実装を用いている. 詳細は[[mrubycで始めるオリジナルIoTデバイス作り|URL:https://magazine.rubyist.net/articles/0059/0059- original_mrubyc_iot_device.html]]を参照のこと.

mruby/c の開発環境

マイコンで mruby/c を使う場合,マイコンの開発環境に mruby/c 関連のソースを加えて,VM をコンパイルすることになります. ESP32 マイコンの場合, ESP32 マイコンの公式開発環境 (ESP-IDF 環境, C 言語) のソースツリーに mruby/c 関連のソースコードを 加え,C 言語と mruby/c コードを一緒にコンパイルすることになる.この時,メインプログラムはあくまで C 言語側である. なお,Ruby では RubyGems, mruby では mrbgems としてそれぞれライブラリ管理の仕組みが存在するが, mruby/c では同等な拡張ポイントはありません.

本リポジトリのディレクトリ構造は,ESP-IDF の標準形に準拠しています. main 以下に C 言語のファイル,components 以下にユーザの拡張ライブラリを置くことになっているため, mruby/c の VM を make するためのソースコードは components 以下に置いている. また,本リポジトリ独自の mruby/c ソースを置くためのディレクトリとして mrblib が用意されている.

   $ tree -L 4 iotex-mrubyc-esp32/

     mrubyc-template-esp32/
     ├── Makefile
     ├── components             外部リポジトリから取り込んだソースの置き場
     │   └── mrubyc              mruby/c の VM のソースなど
   ..........(中略)...............
     ├── main                   C 言語のソース置き場
     │   ├── component.mk
     │   └ mrbc_esp32_gpio.c    
     │   └ mrbc_esp32_gpio.h
   ..........(中略)...............
     │   └── main.c            メインプログラム (C 言語側)
     └── mrblib                リポジトリ独自の Ruby ソース置き場   
         ├── master.rb       メインプログラム (Ruby 側)
         └── class             クラス定義

mruby/c による開発方法

本リポジトリは以下の 2 通りの開発方法に対応している.本 wiki に載っているクラス・メソッドを使う限りにおいては, 方法 1 を採用できる.

方法 1: mruby/c だけで完結させる場合

mruby/c VM を書き込み済みのマイコンボードを使い, PC からバイトコードを送り込む.

  • メリット: 簡単に開発が始められ, 試行錯誤もやりやすい.

  • デメリット: VM 側に用意されている機能以外を使いたい場合には VM の拡張が必要.

    • VM が律速となり, マイコンが持っている全ての機能を使えないことがある.

image

==== 方法 2: マイコンの C 言語開発環境を使う

メーカ等が用意した C 言語開発環境と VM のソースコードを使って, 既存の C 言語のプログラムに mruby バイトコードを結合する.

  • メリット: 既存資産 (C言語プログラムなど) が生かせる. マイコンが持っている全ての機能を使うことができる.
  • デメリット: 開発環境の構築など, 開発開始前の作業が多い, 試行錯誤が少しやりにくくなる (コンパイルに時間がかかる)

image

Clone this wiki locally