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 |
フォルダの構造にもよるが、以下のようなコマンドで、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を越え無いようにする。