ch32funのmruby/cでCH32X035のmrblib


CH32X035用に開発してきたch32funを用いたmruby/cの環境では、FloatとmrblibとTaskを無効にする必要はあるが、 mruby/cの標準的なAPIであるGPIO,ADC,PWM,I2C,SPI,UARTに加えて、標準入出力としてUSB CDCをを組み込んで、flashに4k以上の余裕がある。 ユーザー用のmrbの容量をどの程度確保するかにもよるが、 この余った容量を有効に活用する方法について考えてみた。

その一つの使い方が、無効にしていた機能の一部を有効にするということだろう。 Taskを有効にすることは出来るが、個人的には不要だと思う。 Floatは大き過ぎて、すべてを有効にすることはできない。 一部だけ組み込むことはできるかも知れないが、その取捨選択やmruby/cのソースを変更するのが大変だと予想される。 mrblibを組み込むと、4.5k以上消費するので、これもすべて組み込むことは不可能である。 しかし、mrblibはrubyで書かれているので、その一部を選んで組み込むことも比較的容易である。 mrblibでは、loopやeachやtimesなどの、いくつかの重要なmethodが定義されている。 これらの重要なmethodだけでも組み込めれば有用だろう。

そのためにはmrblibのファイルが必要になるので、 mrubycフォルダにmruby/cのmrblibフォルダをコピーする。 いくつかのファイルから構成されているが、enum.rbが最初に処理され、それ以外はアルファベット順になっていることが、Makefileを見ると分かる。 後で示す方法でこれらを組み込んだときのmrbのサイズの増加は以下の表のようになった。

file mrb size
enum.rb 303
array.rb 2135
hash.rb 202
numeric.rb 285
object.rb 102
range.rb 178
string.rb 1216
まず、arrayとstringが大きく、それ以外はそれほど大きく無いことが分かる。 それぞれのファイルで定義されているmethodは、2026/5/10のブログで取り上げている。 string.rbのmethodは、使わなくても困らないものばかりなので、組み込まなくても良いだろう。 一方、array.rbでは、eachなどの重要なmehodがあるし、Enumerableも組み込んでいるので、methodを取捨選択して組み込むと有用だろう。 array.rbを編集して、methodを消すのは難しく無い。

フォルダの構造にもよるが、以下のようなコマンドで、mrblibの一部とuser.rbを処理したtemp.mrbができる。

mrbc --remove-lv -otemp.mrb ../mrubyc/mrblib/enum.rb ../mrubyc/mrblib/array.rb ../mrubyc/mrblib/hash.rb ../mrubyc/mrblib/numeric.rb ../mrubyc/mrblib/object.rb ../mrubyc/mrblib/range.rb user.rb

そして、main.binとtemp.mrbをcatでくっつけて、wchispで書き込めば良い。 array.rbのeach以外のmethodを消して、string.rb以外を処理すると、約1.3kとなった。 すると、ユーザー用に2.7k以上残る。 単純なプログラムなら、このくらいの容量で十分だろう。

極端な例だが、 object.rbで定義されているloopを使ったtemp.rbを実行するためには、

mrbc --remove-lv -otemp.mrb ../mrubyc/mrblib/object.rb temp.rb 
cat main.bin temp.mrb >temp.bin
sudo ./wchisp flash temp.bin 

とすれば良いのである。 このときのtemp.binが62kを越え無いようにする。