mruby/cに必要な最低限のメモリ
ch32funを用いて、WCH社のマイコン用のmruby/c環境を構築しているが、どの程度のメモリでmruby/cを動かすことができるのかを調べてみた。 mruby/cは3.4.1を使っているが、CH32X035用の環境としては、flashの容量の関係で、mrblibとTaskとFloatを組み込まないようにしている。 この状態でmruby/cに割り当てるメモリを減らしていって、どこまで動くのかを確かめた。
メモリを使うように、配列のサイズを徐々に増やしていって、どの大きさでエラーが出るかを確かめた。 検証用のプログラムは以下のものを用いた。
g=GPIO.new(24+12,GPIO::OUT)
a=[]
i=0
while true
g.write 1
a[i]=i+=1
print "#{i}\r\n"
sleep_ms 100
g.write 0
sleep_ms 200
end
まずは、4kで試すと、177でエラーが生じた。 同様に、3.5kでは113、3.0kで49と、0.5k当たり64ずつ減っている。 GPIOにも多少のメモリを使っているだろうから、計算上では何もしない状態で、2.6kのメモリを占有していることになる。 そして、余った分のメモリを、プログラム中で使っているのだろう。 つまり、3.0kのメモリをmruby/cに割り当てれば、ほとんどメモリを使わないようなプログラムであれば動くということである。
一方、C言語用にもメモリを残しておかなければならない。 今度はmruby/cに割り当てるメモリの量を増やしていって、0.5kぐらいしかメモリが残らないようにして、簡単なプログラムを走らせてみたが、問題無く動いた。 動かすプログラムにもよるだろうが、C言語用にはあまりメモリを残しておかなくても良いのかも知れない。
これまで、mruby/cには10k程度のメモリを割り当てることが多かったが、mrblibなどを使わない場合には、もっと少なくても動くことが分かった。 mruby/cが一応まともに動くような、最小のスペックのマイコンはCH32X035などだと思っていたが、もう少しメモリが少なくても大丈夫なようだ。 具体的には、flashが64k、メモリ10k程度のマイコンなら、ギリギリ動きそうである。 この程度のスペックを持つマイコンとしては、STM32F103やPY32F030などもあるけど、AVR64DUは8bitだから厳しいかな。