June 08, 2013

mRubyにおけるprintf的デバッグ

オートパイロットシステムTinyFeathermrubyを載せてみて動作確認をしています。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__ を見ると、printstrというC言語関数で最終的にfwriteが標準出力(stdout)に出力をしていることがわかります。すなわち Kernel::p/print/puts の結果は stdout に Kernel::__printstr__ を通じて出力されています。

ここで組み込みではよくある標準出力以外、例えばファイルやシリアルポートに出力したければ、この Kernel::__printstr__ を再定義すると目的が達成されます。この方法で、TinyFeather内のmrubyのデバッグをUSBシリアルで可能なようにしました。詳しくはshell.cppの1028行目付近をご覧ください。

なおできれば近いうちにTinyFeatherのソースコード(研究用、また一部は権利関係のためソース非公開でバイナリ提供の予定)をある程度まとめた形で公開したいと考えています。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/885
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。