CH32V006でmruby/c
これまで、EPS8266やESP32についてはArduinoを使って、CH32V203やCH32X035についてはch32funを使って、mruby/cを動くようにしてきた。 これら情報は、ホームページのツールのマイコンのところにまとめてある。 CH32V006は、mruby/cを動かせるギリギリのスペックを持っており、rv003usbによってusbをソフトウェアで扱えるようになっているらしい。 試してみたところ、なんとかmruby/cは動くが、rv003usbがまだ不安定という状況であった。
先日のブログに書いたように、CH32V006は比較的新しいマイコンなので、ch32funではまだ完全に対応しきれていない部分もあり、若干の修正が必要であった。 mruby/cについてのコードでは、PWMではテーブルの変更、ADCではチャンネル番号の変換部分の変更などを行い、ch32v006に対応させることができた。 GPIOはほぼそのままで動作した。 それ以外の機能については、プログラムはそれっぽく修正したが、動作は未確認である。
ch32v006でmruby/cを動かすにあたって最も問題なのは、メモリが8kとかなり少ないことである。 FloatとTaskとmrblibを除いた状態でも、ruby用に割り当てるヒープ領域がかなりギリギリである。 SWDを標準入出力とするものを作ったら、5kか少なくとも4kを確保することができて、簡単なプログラムを動かすことはできて、それなりに安定して動作した。 SWDを接続せずに実行すると、printをすると固まってしまうが、WCH-LinkEと接続してminichlink -Tとしたら、ターミナルへの表示もできる。 USB CDCを標準入出力とすると、最大でも3.5kしか確保できない。 なんとか動くが、ループを回していると、メモリが溢れたり、ハングったりする。 USB HIDを使ったminichlinkのターミナルを標準入出力とすると、4kぐらいは確保でき、minichlink -kT -c 0x1209d003を二回実行すると表示もできるが、しばらくするとハングする。 なお、大きなバイナリをflashに書き込むときには、rv003usbのbootloaderだとしばしばエラーが出るので、書き込はWCH-LinkEで行った。 mrbコードは小さいからか、bootloaderでも書き込めることが多かった。
CDCやHIDが安定しないのは、おそらくrv003usbがCH32V006ではまだ安定して動かないためだろう。 rv003usbのdemo_terminalを動かしてみると、ch32v003で動かすと特に問題は無いのだが、ch32v006では不具合がある。 まず、コマンドを打ったときに、一度目は失敗して、二度目には走る。 そして、ずっと使っているとどこかでハングする。 このように、ch32v006のCDCやHIDの安定性が十分では無いようなので、mruby/cのメモリ不足と合わさって、ch32v006でUSBを使うmruby/cは、すぐに動かなくなってしまう。 USBを使う場合には、CH32V203やCH32X035を使った方が良いだろう。 特に、後者は価格的にもCH32V006とほとんど変らないし。