2012年7月21日土曜日

KOZOSのタスク間通信を可視化するツールを作ってみた (ipcrvt.sh : KOZOS IPC Relationship Visualization Tool)

概要

先週はKOZOS EXPBRDのサンプル・ファームウェアを設計と実装を行なっていました。

サンプル・ファームウェアでは、SDカード上にあるmp3ファイル読み込みながら、mp3デコーダを制御し、赤外線リモコンやユーザ入力を受け付け、ディスプレイの表示をし・・・と沢山の仕事をKOZOSを使ってこなしています。


組み込みシステムでは、システムが提供する機能をある処理単位に分け、複数のタスクに分割した上で所望の機能を実現するために協調動作させるように設計します。
一見複雑な制御も、単純な動作になるまで分けて考えていく事で設計と実装を容易にする事が出来ます。

組み込みシステムの場合、ある出来事(イベント)を中心に動作を実行するイベント駆動型としてファームウェアを設計するのが通例です。タスクは基本的に他のタスクから受けたイベントを起点に動作します。あるタスクが他のタスクにイベントを伝える事を、「タスク間通信(Inter Process Communication)」と言ったり、OSによっては「メッセージ・パッシング」と呼びます。

上記のように設計する事で、タスクとタスクの間の依存関係は非常に緩いものにする事ができる他、新たな機能を付け加えやすくなったり、デバッグが容易になったりします。

しかし、設計文書でいくら図示してあったとしても、実際にコードに落とし込んだ段階でそれらの情報は失われてしまうため、後からコードを見た第三者がファームウェア全体の挙動を把握するのには非常に時間がかかります。

今回は、このような時に便利な方法として内部タスク間コミュニケーションを可視化するツールを作ってみましたのでご紹介します。

今回は茶室で楽しむKOZOS拡張基板の企画もあるので、KOZOSを題材に実装してみました。

実例1

KOZOSの作者である坂井さんがお作りになったTCP/IPアプリケーションを題材にしました。
http://kozos.jp/kozos/h8_2_06.html

まずは下の図をクリックして大きくしてご覧下さい。


KOZOSのタスク間通信は、kz_sendとkz_recvとkx_sendから構成されています。
図を見てわかるように、タスク(及びそれっぽいもの)が丸枠で囲われたもので表現されています。
メッセージ通信の橋渡しとなるメッセージボックスが長方形で表現されています。

それっぽいものと書いたのは、ソースファイル名で抽出しているので必ずしもタスク名とイコールでないこともあるからです。

上記を見てわかるように、ソースコードを眺めて関係性を把握するよりも遥かに直感的です。
実行方法は簡単でシェル・スクリプトをKOZOSアプリケーション・ディレクトリで実行するだけ。

実例2

ちなみにKOZOS EXPBRDのサンプル・ファームウェアにも適用してみました。
こちらは少し改造したシェル・スクリプトですが、だいたい同じものです。


こんな感じでKOZOSで構成した各タスク間のタスク間通信の関係をひと目で把握できます。

実行方法

リソースからサンプル・コンテンツをダウンロードして下さい。
ipcrvt.shをKOZOSアプリケーション・ディレクトリで実行して下さい。
外部依存は幾つかのコマンドとGraphviz/dotのみ。
簡単なシェルで構成されているので改造も容易です。
オプションは取りません。


リソース

坂井さんが実装されたTCP/IPアプリケーションのコードと、可視化スクリプトipcrvt.shを同梱したパッケージです。
ipcrvt.tar.gzをダウンロード

まとめ

現状のipcrvt.shは、まだまだ表示したい情報が欠けいていますし、随分と荒削りな設計と実装です。

しかし、ソースコードを目視で把握するよりも遥かに早いスピードで関係性の概要を把握する事ができるという点で、第1段階のアプローチとしてはまずまずな結果と言えるでしょう。
このツールを使って関係性の概要を把握した上で、ソースコードを読み解いていけば理解が素早く理解を深める事ができる気がします。

また、組み込みシステムで特に意識する必要のあるタスク間通信の学習においても、有用なツールの一つとして役立てることができそうです。

今回はKOZOS向けにシェル・スクリプトを構成していますが、同様の考えを使って他のRTOSでも使用する事ができます。

0 件のコメント:

コメントを投稿