2012年7月27日金曜日

組み込みシステムの全体挙動を簡単に確認できるロギングツール - Natural Tiny Logger (NT-Logger)

先のツールとの関係

「KOZOSのタスク間通信を可視化するツールを作ってみた (ipcrvt.sh : KOZOS IPC Relationship Visualization Tool)」でも取り上げたように、リアルタイムシステムでは、ある作業単位を設計し、タスクに落とし込んでいく形でシステムを実現するのが通例です。

先の記事では、タスク間通信の関係を実装から簡単に明らかにする方法を紹介しました。
タスク間通信の関係が明らかになることで、システムの中の複数のモジュールの依存関係が明確になり、システムに与える刺激(入力)とシステムから得られる反応(出力)を推測できるようになります。


先のタスク間通信の関係を明らかにするツールは、あくまでもソースコードから得られる静的な情報を基にしたものでした。
実際のリアルタイムシステムの場合、複数のタスクの相互関係性が常に変化するため、ソースコードから得られる静的な情報だけでは、見て取れない動作が膨大に存在します。

そこで、今回は上記の可視化ツールに加えて、実際のシステムの挙動を観察する事のできるロギングツールを設計実装しました。

Natural Tiny Logger (NT-Logger)の特徴

本ツールの特徴を挙げます。
  • シリアルポートのある組み込みシステムなら、どんなシステムでも使用可能。
  • 組み込みシステム側に巨大なメモリが不要。
  • 記録時間はホスト側のストレージの容量に依存。長時間の記録が可能。
  • シンプルな設計で移植や改造が容易。
  • ホスト側プログラムはWindows, Mac OS, Linuxと3つのプラットフォームに対応。
Natural Tiny Logger (NT-Logger)による最終出力はブラウザ上で確認する事ができます。
マウスホイールで時間軸を伸ばしたり縮めたりしながら、システムの全体挙動を確認できます。




数年前(2010年前半頃)にTOPPERSプロジェクトのTrace Log Visualizerを使用したのですが、その時からNT-Loggerのプロジェクトがスタートしました。 Trace Log Visualizerは、ターゲット側のメモリにイベント情報を記録し、あるタイミングでホスト側に記録したデータを出力するという仕組みでした。この場合、ターゲット側に巨大なメモリが存在していなくてはならず、TOPPERSのように小規模組み込みシステムで使用したいOSのロギングツールとして魅力をあまり感じませんでした。

Natural Tiny Logger (NT-Logger)の原型は当時にあったのですが、先にNatural Tiny Shell (NT-Shell)の設計実装を開始したのでなかなか手が回りませんでした。

Natural Tiny Logger (NT-Logger)の対象外

NT-Loggerは、上記に記した特徴示すと同時に、幾つかのトレードオフについてユーザに説明する必要があります。
  • ターゲットとホスト間の通信経路においてのバッファリング等による遅延などの影響は考えない。
  • ターゲットとホスト間の通信経路に存在するであろうバッファリング等による遅延やジッタの影響は、測定対象単位時間に対して十分に小さく無視できるものとして扱う。
  • 絶対時間情報を必要とするようなデバッグには使用できないが、メッセージパッシングで駆動するリアルタイムシステムにおいて、通常は因果関係が明らかであるので問題ないものとして扱う。
  • 非同期システムのデバッグに使用できない事を意味するが、因果関係のはっきりしないような不確定要素を含むリアルタイムシステムは、そもそも設計してはならないものとして、これを無視する。
  • ロギングのためのオーバーヘッドは無視できるほどに小さいものとして扱う。
中には少し過激なトレードオフに見えるものもあるかもしれません。
これはNT-Loggerが「無いより遥かに便利!」、「しかも無償で使える!」というところを念頭に置いているからです。

「そんなロギング意味がない!使い物にならない!」というケースでは、こんな中途半端なツールは使うべきではないでしょう。それは、NT-Loggerがとったトレードオフに含まれる種々の問題を解決したツールを使うべきです。というのが、NT-Loggerの立場です。

どんな組み込みシステムでも使える

組み込みシステムの全体挙動を確認するためのツールは、市販品を中心に星の数ほど存在します。
多く見られる実現形態の一つが、ターゲットとホストの間に専用のハードウェアを介入させて、忠実にイベントをロギングする形態です。
確かに忠実なイベントのロギングには、これが一番信頼性の高い方法でしょう。
中間装置が正確な時刻情報を付与すると共に、データをバッファリングし、ホストコンピュータの処理能力に影響されずに正確にロギングする事ができます。

これらの中間装置を必要とするロギングツールの場合、導入コストがかなりかかる事が多いです。
実際の開発では、システムの全体挙動の概要を確認するだけで、どんな問題があるのかわかる事も多々あります。少し調べたいだけの時に高価なロギングツールを購入できるかどうかは状況によります。


先のトレードオフでも述べたとおり、組み込みシステムの場合はイベント駆動型で設計するのが普通のアプローチです。あるイベントがある動作を引き起こすという因果関係を明らかにするのと同時に、 原因と結果の依存関係を緩い依存関係で留める事ができるわけです。


NT-Loggerは、多くの組み込みシステムに搭載されているシリアルポートを有効に活用し、必要最低限のロギング機能で最大限の効果を挙げることを目的に設計されています。因果関係が明らかになっている組み込みシステムの場合、簡単なロギングメカニズムを追加するだけでも十分な効果が得られるというわけです。

設計と概念など

ここで、設計や概念などを記しておきます。

基本設計と概念

  • イベントは、「イベント発生源」から発生する。
  • イベントは、イベント情報で表現される。
  • イベント情報には、「始まり」と「終わり」を示す「タイプ番号」がある。
  • イベント情報には、「イベント発生源」を示す「トラック番号」がある。
  • イベント情報には、イベント内容を示す「イベント番号」がある。
  • ターゲットから送られるイベント情報には、「トラック番号」と「イベント番号」と「タイプ番号」が含まれる。
  • ホストは、ターゲットから送られるイベント情報に時間情報を付与して記録する。
  • ホストは、記録されたデータを基にした可視化データを生成する事ができる。

NT-Loggerの使用手順

  • ターゲット側プログラムにロギング用APIを埋め込み動作させる。
  • ホスト側でキャプチャプログラムを実行する。
  • キャプチャされたデータからHTMLを生成するジェネレータを実行する。
  • ブラウザで結果を確認する。

仕様

  • 最大トラック数は16トラック。
  • 1トラックあたり8つのイベントを記録可能。(単純計算で16x8=128事象が扱える事になる。)
  • 記録イベントの分解能はマイクロ秒単位。
  • RAMが1KBを切るようなシステムでも使用可能。
  • ターゲット側は最小限のAPIの実装のみで移植可能。 
  • データはブラウザで閲覧可能。

今後の計画

現在初版のリリースに向けて作業を開始しています。
暫くこのブログもNT-Loggerまみれにしようと考えています。

0 件のコメント:

コメントを投稿