LPC11U35とmruby/c
入手しやすいマイコンボードで、mruby/cが動きそうなものとして、NXP社のLPC11U35というものを見付けた。 このマイコンは、webブラウザ上で開発できるmbedが使えたことで知られているが、mbedのサービスが終了したので、開発環境が悩ましいものとなっている。 特徴としては、ROMにUSBのプログラムが搭載されているので簡単にUSBが扱える点と、USBからdiskとして認識させてそれに書き込むとflashが書き換えられるという点と、消費電力が小さいので電池駆動に向いている点などが挙げられる。
LPC11U35は64kのflashと8kのRAMをもち、ギリギリmruby/cが動きそうではある。 mruby/c部分とマイコン部分のプログラムを分離したことで、新たなマイコン用のmruby/cを作りやすくなったので、このマイコン用でもmruby/cを動かしてみようかな。 しかし、このマイコンを活かすに当って問題がある。 現状のmruby/c部分のプログラムには、I2CとSPIは一つしか使わない設計になっており、また省電力のためのdeep sleepなども組み込まれていない。 LPC11U35にはSPIが二つあるのである。 まずは、これらを拡張するところから始めようと思う。 しかし、機能を増やすということは、サイズが大きくなるということを意味しており、難しい問題である。 でも、仕様を変更するのなら、初期の方が良い。
UARTについては、すでにunitをいくつも指定できるようにしているが、マイコン側のサブルーチンにはhandleをそのまま渡している。 マイコンの仕様によって、バッファが必要だったり、様々な状況が考えられるので、そのようにした。 I2CとSPIについても、そのようにするべきか、バッファなどは作らないかマイコンにまかせることにしてunit番号だけを渡すようにするのかの選択肢がある。 後者の方が楽に書けそうだし、サイズも小さくなりそうだけど、将来の拡張性が限定されてしまう。 どうしようかな。
sleepについては、sleepやsleep_msがkernelのmethodになっているので、deep sleepも同じようにすれば良いだろう。 問題は、時間の単位を秒にするのか、ミリ秒にするのかという点である。 本当のdeep sleepは、秒で良い気がする。 一方、省電力用のlight sleepはどちらが良いだろうか。 これも悩ましい。