June 01, 2013mRubyとC++の親和性オートパイロットシステムTinyFeatherにmRubyを載せて遊んでいます。最近はextend_sample.rbに示したようなRubyのコードで誘導制御の部分も動くようになりました。これはmRubyから既存のコードを呼び出すことで可能となったのですが、既存のコードの大半はC++で書いてあります。せっかくなので、mrubyをC++のオブジェクト指向を意識して融合することにしました。 mRubyはC言語で書いてあります。そういった事情からC++のオブジェクト指向的な方法でコードを融合するのは難しいのでは、もしかしたらmRuby自体の書き換えが必要かも、と思っていたのですが、そんなことはありませんでした。 mrb_state構造体の定義はmruby.hにあり、そこには/* auxiliary data */のコメントがあります。補助データ、ということでとても匂います。 TinyFeatherではこれらのテクニックをshell.cppのかなり後の部分(930行目付近)で使っています。なおshell.cppはmRubyと既存のコードの糊として働いている部分です。 June 08, 2013mRubyにおけるprintf的デバッグオートパイロットシステムTinyFeatherにmrubyを載せてみて動作確認をしています。mrubyは組み込み可能な軽量言語であり、組み込みといえばprintfデバッグなわけですが、それに相当するmrubyっぽいデバッグ方法を実装して動作確認に励んでいます。今回は備忘録がてら、その方法を紹介しようと思います。 mrubyの出力系メソッドとしては Kernel::p (引数オブジェクトの中身をinspect等で文字列化して出力) や Kernel::print (文字列を出力)、Kernel::puts (文字列を出力して改行)があります。これらのメソッドはmrubygemsのmruby-printを有効にすると使えるようになります。mruby-printで定義されるのはRuby拡張(print.rb)によるp/print/puts ばかりでなく、その低レイヤーとして働くC言語拡張(print.c)の Kernel::__printstr__ があります。 ここで組み込みではよくある標準出力以外、例えばファイルやシリアルポートに出力したければ、この Kernel::__printstr__ を再定義すると目的が達成されます。この方法で、TinyFeather内のmrubyのデバッグをUSBシリアルで可能なようにしました。詳しくはshell.cppの1028行目付近をご覧ください。 なおできれば近いうちにTinyFeatherのソースコード(研究用、また一部は権利関係のためソース非公開でバイナリ提供の予定)をある程度まとめた形で公開したいと考えています。 June 22, 2013MAXIIとMAXVの比較オートパイロットシステムTinyFeatherでは、CPLDとしてAltera MAXII EPM1270T144C5N(1270LE 144TQFP)を載せています。現在はMAXIIに比べ性能が向上したMAXVも入手が良くなってきているようなので、MAXIIをMAXVに置き換えられるよう、基板の一部を再設計してみています。特にMAXVに変更することによって、内蔵されているユーザフラッシュ(UFM)の書き換え回数がMAXIIが100回であったのが、MAXVになると1000回まで保証され伸びていることが僕にとっては魅力です。またMAXVの方がお安いです。 さて変更するにあたって、MAXII(EPM1270T144C5N)とMAXV(5M1270ZT144C5N)とが、どの程度ピン互換性があるのか調べてみました。以下のシートのとおりですが、結果からいうと11番ピン, 78番ピンがMAXIIがIOであったのがMAXVではGNDIOに変わっています。 その他としては、MAXVがVCCINT=1V8であることに注意すること、JTAG端子はVCCIOでH/Lレベル決定しているので特にMAXIIから移行する際に注意しなくてよいこと、が比較した成果として重要でした。 |
かれんだ~
スポンサード リンク
|