Developers_プログラム作成・VMコンパイル・書き込み - gfd-dennou-club/mrubyc-esp32 GitHub Wiki

はじめに

マイコンで mruby/c を使う場合,マイコンの開発環境に mruby/c 関連のソースを加えて,VM をコンパイルすることになる. 本リポジトリでは,ESP32 マイコンの公式開発環境 (ESP-IDF 環境, C 言語) のソースツリーに mruby/c 関連のソースコードを 加え,C 言語と mruby/c コードを一緒にコンパイルしている.この時,メインプログラムはあくまで C 言語側である.

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

   $ tree -L 4 iotex-mrubyc-esp32/

     mrubyc-template-esp32/
     ├── CMakeLists.txt
     ├── components               外部リポジトリから取り込んだソースの置き場
     │   └── mrubyc-3.4.0         mruby/c の VM のソースなど          
   ..........(中略)...............
     ├── main                   C 言語のソース置き場
     │   ├── CMakeLists.txt
     │   ├── Kconfig.projbuild
     │   ├── main.c             メインプログラム (C 言語側)
     │   ├── mrbc_esp32_adc.c
   ..........(中略)...............
     └── src                   メインプログラム (Ruby 側)
         ├── master.rb
         └── slave.rb

VM のコンパイルとマイコンへの書き出し

リポジトリをクローンする.

$ git clone https://github.com/gfd-dennou-club/mrubyc-esp32.git 
$ cd mrubyc-esp32

idf.py build コマンドで VM がコンパイルされる.

$ idf.py build

idf.py flash コマンドで VM がマイコンへの書き込まれる

$ idf.py flash         

プログラムの作成と実行 [シングルタスク]

メインプログラムは src/master.rb に設置する. 以下は "Hello World" を定期的に表示するだけのプログラムとなっている.

$ cat src/master.rb

  while true  
    puts "Hello World!"  
    sleep 5  
  end  

idf.py spiffs-flash で master.rb をコンパイルしてマイコンに書き込む. さらに,idf.py monitor でモニタ出力,を行うことができる. モニタ出力を止めるときは Ctrl-] を打鍵する.spiffs-flash と monitor は同時に idf.py の引数として与えることができる.

$ idf.py spiffs-flash monitor

プログラムの作成と実行 [マルチタスク]

mrubyc-esp32 リポジトリで配布している VM はマルチタスクに対応している.マルチタスクで動かす場合には, src ディレクトリ以下の master.rb と slave.rb の 2 つに,並行して動作させるプログラムを書きこめばよい. なお,シングルタスクでの動作に戻す場合は,src/slave.rb ファイルの中身を全てコメントアウトすれば良い.

マスターとスレーブで異なる周期で Hello World を表示するだけでなく,スレーブで設定した変数をマスターで表示する サンプルプログラムは以下のようになる. なお,共有変数として使いたい変数には,変数名の先頭に $ (ドル) 記号を付すこと.

$ vi src/master.rb

     $msg = "ESP32"
     while true 
       puts "hello world from #{$msg} (master)"
       sleep 1   # 1 秒おき
     end

$ vi src/slave.rb

     i = 1
     while true
       puts "hello world from ESP32 (slave) #{i}"

       if ( i % 2 == 0 )
         $msg = "hoge"
       else
         $msg = "peke"
       end
       i += 1
       sleep 5   # 5 秒おき
     end

マルチタスクの場合も,プログラムの書き込み方法はシングルタスクの場合と同じである. idf.py spiffs-flash で master.rb をコンパイルしてマイコンに書き込む. さらに,idf.py monitor でモニタ出力,を行うことができる. モニタ出力を止めるときは Ctrl-] を打鍵する.spiffs-flash と monitor は同時に idf.py の引数として与えることができる.

$ idf.py spiffs-flash monitor

  ...(中略)...

   hello world from ESP32 (master)
   hello world from ESP32 (slave) 1
   hello world from peke (master)
   hello world from peke (master)
   hello world from peke (master)
   hello world from peke (master)
   hello world from ESP32 (slave) 2
   hello world from hoge (master)
   hello world from hoge (master)
   hello world from hoge (master)
   hello world from hoge (master)
   hello world from hoge (master)
   hello world from ESP32 (slave) 3
   hello world from peke (master) 
   hello world from peke (master)
   hello world from peke (master)
   hello world from peke (master)
   hello world from peke (master)
   hello world from ESP32 (slave) 4
   hello world from hoge (master)
   hello world from hoge (master)

  ...(以下略)...