Skip to content

Developers_プログラム作成・VMコンパイル・書き込み

Ko-ichiro Sugiyama edited this page Jun 6, 2023 · 12 revisions

はじめに

マイコンで mruby/c を使う場合,マイコンの開発環境に mruby/c 関連のソースを加えて,VM をコンパイルすることになる. 本リポジトリでは,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
     ├── bin                    実行ファイル
     ├── components             外部リポジトリから取り込んだソースの置き場
     │   └── mrubyc              mruby/c の VM のソースなど
   ..........(中略)...............
     ├── main                   C 言語のソース置き場
     │   ├── component.mk
     │   └ mrbc_esp32_gpio.c    
     │   └ mrbc_esp32_gpio.h
   ..........(中略)...............
     │   └── main.c            メインプログラム (C 言語側)
     └── mrblib                リポジトリ独自の Ruby ソース置き場 (クラス定義)  
     │   ├── adc.rb
     │   ├── gpio.rb
   ..........(中略)...............
     └── src                   メインプログラム (Ruby 側)
         ├── master.rb
         └── slave.rb

環境設定

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

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

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

ESP-IDF の環境変数を export する.上記の通りにインストールしていれば ~/esp/esp-idf/export.sh に 環境変数設定用のスクリプトが存在する.別のディレクトリに esp-idf をインストールした場合には, ~/esp/esp-idf の部分を適切に書き換えて欲しい.

$ source ~/esp/esp-idf/export.sh

make menuconfig で "Serial flasher config" と "mrubyc-esp32 Configuration" の項目を確認してから,make, make flash する.

$ make menuconfig

   "Serial flasher config" において,ESP32 マイコンのデバイス名を指定する.
   "mrubyc-esp32 Configuration" において,ESP32 マイコンのどの機能を有効にするか選択する (動作確認の時は特に変更する必要はない).

make コマンドで VM がコンパイルされる.

$ make 

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

マイコンの書き込み

$ make flash         

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

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

$ cat src/master.rb

  while true  
    puts "Hello World!"  
    sleep 5  
  end  

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

$ make spiffs monitor

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

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

Ruby コードの作成

マスターとスレーブで異なる周期で 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

作成した ruby コードのコンパイルとマイコンへの書き込み

master.rb および slave.rb を書き換えるたびにコンパイルとマイコンへの書き込みを実行する.これは make spiffs というコマンドでまとめて行うことができる.

$ make spiffs

    Toolchain path: /home/user/.espressif/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
    Toolchain version: esp-2020r3
    Compiler version: 8.4.0
    .... 以下略 ....

モニタ出力の確認

モニタ出力の確認は make monitor コマンドで行うことができる.モニタを終了する場合は Ctrl-] を打鍵すること (コントロールキーと ] キーを同時に押すこと). 以下の例は,コンパイル・マイコンへの書き込み・モニタ出力を同時に行うものとなっている.

$ make spiffs monitor

  Toolchain path: /home/user/.espressif/tools/xtensa-esp32-elf/esp-2020r3-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
  Toolchain version: esp-2020r3
  Compiler version: 8.4.0

  ...(中略)...

   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)

  ...(以下略)...
Clone this wiki locally