Rubyと一緒(1) GR-CITRUSでビットバンギングの周波数を測ってみる

Joseph Halfmoon

特価品(見切り品?)のGR-CITRUSボードを入手。Rubyの組み込み版mruby処理系がルネサスRX631マイコンに書き込み済のボードであります。開発ツールについてはちょいと不安があるものの、Rubyでマイコンが制御できとります。今回はありがちな「ビットバンギング」で処理速度の目安を調べてみとうございます。

mrubyとMicroPython、REPLの有無

別シリーズ『MicroPython的午睡』にてMicroPython処理系搭載の各種マイコンを使ってきております。スクリプト処理系をマイコンに搭載したということで mrubyとMicroPythonと比較せずにはおられませぬ。

まず目を引くのがREPLの有無、ホストとの関係です。MicroPythonでは起動後すぐにマイコン上でMicroPython処理系が立ち上がり所定のスクリプトを実行します(起動後すぐに制御などの処理入る場合は所定の名でスクリプトをセーブしておけば目的を達します。通常は空処理)が、その実行が終わるか、キーボードから割り込まれればREPLに落ちてきます。REPLは標準入出力であるUSBシリアルに接続しています。なんとなればUSBシリアルに適当な仮想端末ソフト(Teratermなど)を接続し、Pythonコードを書いて走らせることも可能です。中間コードへのコンパイルとその保持も可能ですがオプショナルです。

一方 GR-CITRUS搭載のmruby処理系の場合、デフォルトでホストとの相手をしているのはFlashへの書き込みとmruby処理系の起動を担当しているFlash制御ソフトのようです。該当のソフトはホストから送られてくるmrbフォーマットに「コンパイル」されたバイナリ中間コードをマイコン上のFlashに書き込み、それをmruby処理系に処理させているようです。irbのようなインタラクティブなREPLを起動する方法は今のところ見当たりませぬ。起動時に所定のmrubyコードを起動することも可能ですが、これはボード上のジャンパをハード的にショートさせる必要があるようです。

ビットバンギングでmrubyの実行速度の目安を

既にオンボードのLEDを使って吉例Lチカはやってみていますが、今回は外部端子をmrubyコードで bit banging させてみて、その処理速度についてだいたいの線を押さえておきたいと思います。頭にあるのは、ボードにもよりますが

MicroPython処理系の場合、1ステートメント6μ秒くらい

という漠然とした数字です(ボードの速度は80MHzくらいかと。)

※2023年4月4日訂正:1ステートメント6μ秒というのは125MHz動作のラズパイPico上のMicroPythonの数字だったような(忘却力の年寄なので当てになりませぬ。)今回実測クロック85.4MHz(建前84MHz)のSTM32マイコン上のMicroPythonでほぼほぼ同様のビットバンギングを行った結果を取得しました。結果はこちら

ビットバンギング用の回路(回路というほどのものじゃござんせんが)が以下に。GRCITRUS_BB_Schematic

肝心のRubyコードは以下です。

#!mruby
usb = Serial.new(0, 9600)
usb.println("Bit Banging on Pin.4")
pinMode(4, 1) #pin 4, OUTPUT
while true do
    digitalWrite(4, 1)
    digitalWrite(4, 0)
end

きわめて簡潔。ただしちょっとRubyっぽくないのは、シリアルに出力するときに puts が使えず、.println使うところです。GR-CITRUSで使える入出力のメソッドは以下のページで解説されてますが、ぶっちゃけ Arduino風のお名前です。mrubyでなく、Arduino風の開発環境もあるみたいなので、どうもそちらと共用なんじゃないかと。

GR-CITRUS 特設:クラス、メソッド早見表

なお、Serial.new(0, … とやって接続できるシリアルの0はUSBシリアルポートです。これでホストとシリアル通信できます。なお、Chrome上のRubic環境ではビルド結果などを表示してくれるウインドウがシリアルモニタをかねているようです。こんな感じ「コンソールに接続しました」と。RubicEDITOR

ビットバンギングの周波数を実機確認

まあ、Rubyに速度を求めちゃいけない、ということは頭では分かってます。でもGR-CITRUSのマイコン、RX631は96MHz動作です。FlashもRAMも100MHzまでノーウエイトいけるらしいし、ぶっちゃけMicroPython走らせているどのマイコンよりも速そうなスペックです。結果が以下に。

bitbangingResult

25kHzということは上のwhileループ1回に40μ秒くらいかかっている計算です。「1ステートメント」十数μ秒くらいっすかね。

まあ、スピードについてとやかく言わず、Rubyっぽく書くことを第1に考えていきたいと思います。特にRustからRubyにやってくると、目の前に自由の大洋が開けている?感じがします。とってもお楽。

鳥なき里のマイコン屋(165) 特価品(見切り品?)、GR-CITRUS入手、なんとかLチカ

Rubyと一緒(2) GR-CITRUSでPWM信号出力を使ってみる へ進む