mbed(GR-PEACH) を使ってみて mruby をのせた話

ルネサスがやっている"がじぇっとるねさす"というプロジェクト(?)で、GR-PEACHというマイコンボードのプロデューサー活動という企画があり、発売前のGR-PEACHボードが使えるというので、応募したら当たったのが11月末頃。

そして、3/21に最終発表会というのがあり、そこに向けて作ったのがこれです。

発表会は遠いので参加できなくて動画送っただけ。
発表者はRev.Upしたボードもらえる的なことが書いてあったけれど、もしかしたら会場行った人だけなのかもしれないので残念です。

さて、このGR-PEACHですが、mbedに対応していて、Cortex-A9 400MHz、ROM8MB、RAM10MB、EtherPHYあり、CamI/Fあり、SDHCありと、他のmbedプラットフォームとは一線を画す異色ボードなのですが、いざ使ってみると、mbedライブラリが拡張されているわけではないので、あまりGR-PEACHならではの遊び方はできず、CPUとROM/RAMを活かせれば良いかなという状況でした*1

当初は、mbed環境としてもなかなか安定していないようで、他のプロデューサーの方々が活発に動作報告されているのを横目にみつつ、プロデューサーは、一回はmbedのコミュニティで、コメントとかするというノルマのため、「cmsis は Cortex-M 用だからNVIC の API とか、Cortex-A でどう実装されてるんですか?NVIC を GIC に置き換えるだけで良いんですか」という質問をしたけれど、どうなったかわかりません。

本題です。

最終発表会に向けて、せっかくなので何か仕上げたいと思っていたのですが、ROM/RAM潤沢なのを活用するのに、mruby を載せてたので、mbedライブラリのバインディングを書けばネタになりそうと思ったのが3月も半ば。
mbed も mruby よくわかってないながら、必死にドキュメント読みつつ、Lチカを目標として、mrbgems に Mbed モジュールを作り、その下に mbed の各クラスのラッパーを作ろうと、

まず、DigitalOutクラスをつくる

タイマーいると思い、Timerクラスを追加

LチカにTimerクラスいらないと知り、Mbed のモジュール関数として、sleep関連を追加

PinName を Mbedのモジュール定数に追加

Tickerを追加しようとして挫折、時間切れ

となり、最終的にこれだけしか実装できてない状態です。

Mbed
-- Mbed::LED1
-- Mbed::LED2
-- Mbed::LED3
-- Mbed#sleep()
-- Mbed#sleep_ms()
-- Mbed#sleep_us()
-- DigitalOut
---- DigitalOut::initialize()
---- DigitalOut::read()
---- DigitalOut::write()
-- Timer
---- Timer::initialize()
---- Timer::start()
---- Timer::stop()
---- Timer::reset()
---- Timer::read()
---- Timer::read_ms()
---- Timer::read_us()

Ticker で挫折したのは、Tickerの実装をこのようにしようと思いましたが、

ticker = Ticker.new
ticker.start(0.5) do
  a = DigitalOut.new LED1
  a.write(a.read ^ 1)
end

ブロックをTickerのタイマー割り込みで呼ぶ場合に、mrb_state の渡し方がよくわからなかった。というか、この時のブロックのコンテキストがどうなるべきかよくわかってないので、ちょっと時間がかかると思い保留にしました。結果的には、動画のLチカはsleep()のループで実現してます。

mirbで、このMbedモジュールがさわれるmbedのプログラムはこちらです。

mirb_mbed - a mercurial repository | mbed

動画の環境はこれに加えて、簡易Webサーバを立てていて、ブラウザからPOSTしたプログ
ラムを、SDカード上のファイルに書き込んでから、mruby コマンドで実行しています。恥ずかしくてみせられたものじゃない実装ですがこちらです。

mruby_mbed_web - a mercurial repository | mbed

メインスレッドのスタックが足りなくなるので、mbed-rtosで、OS_MAINSTKSIZE を 512*4 くらいに適当に増やす必要があります。

力量不足を除いては、特に苦労したのは、mbedのオンラインコンパイラしか無い点です。これについては、先日、GR-PEACHでもgcc環境へのエクスポートがサポートされました。mruby 自体は、ドキュメントがあまり見つからないのが難ですが、ソースも読みやすいし、何にも依存しないので、mbedにもすんなりのりました。

今後は、せっかくなので、Tickerはじめ、Mbedの他のI/Fも実装して行きたいのと、GR-PEACHだけではなく、他のmbedプラットフォームでも動かしてみたいです。おそらくFRDM-k64fくらいROM/RAMあれば動くんじゃないかと思います。しかしながら、CamI/Fもさわりたくて、OV7670 と OV9640 を買ってしまったので、こっちのほう優先してしまうかも。

*1:もちろん RZ/A1Hのリファレンス実装からドライバ持ってくれば、カメラとか遊べるし、今後はカメラシールドとか、そのライブラリ展開も発表されてる。