2009年07月08日
イベントトラッカー機能の紹介
PARTNER-Jet には、イベントトラッカーという機能が標準で搭載されています。
http://www.kmckk.co.jp/event_tracker/index.html
イベントというと何やら難しそうですが、ここでいうイベントとは「ターゲットプログラムの実行中に、なんらかの変化が起こった」ということを指します。例えば OS のタスク切り替えや、OS が無い場合は pc が特定のアドレスに来た場合など、任意の状態変化をイベントとしてユーザ定義することができます。
イベントトラッカーは、メモリに記録したログデータをグラフィカルに表示・解析するための汎用的なしくみを提供します。
組み込みソフトウェア開発で printf デバッグができるのは、けっこう恵まれた状況です。開発初期はシリアルコンソールすらつながっておらず、一切の I/O が使えない状況がけっこうあります。
PARTNER-Jet のような JTAG-ICE デバッガを使えば、そのような状況でも、とりあえずステップ実行をしてプログラムの動きを追うことができます。しかし、割り込み処理など、タイミングが重要なプログラムをデバッグする際には、これだけでは厳しいです。
PARTNER-Jet には、VLINK という、ターゲット上で動くプログラムから直接デバッガに printf などで出力できるという機能もあるのですが、そもそも printf 自体が比較的重い処理となるため、RTOS などのイベントハンドラの中で呼ぶことは厳しいですし、printf を呼ぶとタイミングが狂って再現しなくなってしまうバグなどもありがちです。
このような場合、イベントトラッカーが威力を発揮します。イベントトラッカーは、JTAG がつながって、メモリの読み書きができて、ログ用のバッファが確保できる状況ならば使えます。しくみが単純で処理が軽いぶん、様々な場面に使える、非常に一般的なデバッグ手法と言えます。
OS を使う場合は、Linux や各種 RTOS (T-Kernel や Toppers) など、それぞれの OS ごとに KMC が提供するパッチを当てることにより、プロセスの切り替えなどのタイミングを詳細に記録することができます。
OS が無い場合は、直接 KMC が提供するヘッダとソースコードをプロジェクトに組み込み、初期化関数を読んだ後、任意のタイミングでイベント発行関数(引数に与えられた整数がイベントとして記録されます)を呼ぶことで、イベントログを取ることができます。1 ヘッダと 1 ファイルのみなので、カスタマイズも簡単にできます。
イベントトラッカーがやっていること自体は特別なことではなく、多かれ少なかれ、どこの組み込み開発でもアドホックに行われていることだと思います。しかし、デバッガと連携した汎用のしくみが最初から提供されることにより、CPU 占有時間の計算やイベントの抽出・マスク機能など、高度な表示や統計・解析機能が簡便に使えるようになり、工数が削減できます。また、しくみが共通化されることにより、デバッグの属人性が薄まり、ノウハウの共通化が可能になるため、開発そのものだけではなく、技術教育面などにも恩恵があると考えられます。
http://www.kmckk.co.jp/event_tracker/index.html
イベントというと何やら難しそうですが、ここでいうイベントとは「ターゲットプログラムの実行中に、なんらかの変化が起こった」ということを指します。例えば OS のタスク切り替えや、OS が無い場合は pc が特定のアドレスに来た場合など、任意の状態変化をイベントとしてユーザ定義することができます。
イベントトラッカーは、メモリに記録したログデータをグラフィカルに表示・解析するための汎用的なしくみを提供します。
組み込みソフトウェア開発で printf デバッグができるのは、けっこう恵まれた状況です。開発初期はシリアルコンソールすらつながっておらず、一切の I/O が使えない状況がけっこうあります。
PARTNER-Jet のような JTAG-ICE デバッガを使えば、そのような状況でも、とりあえずステップ実行をしてプログラムの動きを追うことができます。しかし、割り込み処理など、タイミングが重要なプログラムをデバッグする際には、これだけでは厳しいです。
PARTNER-Jet には、VLINK という、ターゲット上で動くプログラムから直接デバッガに printf などで出力できるという機能もあるのですが、そもそも printf 自体が比較的重い処理となるため、RTOS などのイベントハンドラの中で呼ぶことは厳しいですし、printf を呼ぶとタイミングが狂って再現しなくなってしまうバグなどもありがちです。
このような場合、イベントトラッカーが威力を発揮します。イベントトラッカーは、JTAG がつながって、メモリの読み書きができて、ログ用のバッファが確保できる状況ならば使えます。しくみが単純で処理が軽いぶん、様々な場面に使える、非常に一般的なデバッグ手法と言えます。
OS を使う場合は、Linux や各種 RTOS (T-Kernel や Toppers) など、それぞれの OS ごとに KMC が提供するパッチを当てることにより、プロセスの切り替えなどのタイミングを詳細に記録することができます。
OS が無い場合は、直接 KMC が提供するヘッダとソースコードをプロジェクトに組み込み、初期化関数を読んだ後、任意のタイミングでイベント発行関数(引数に与えられた整数がイベントとして記録されます)を呼ぶことで、イベントログを取ることができます。1 ヘッダと 1 ファイルのみなので、カスタマイズも簡単にできます。
イベントトラッカーがやっていること自体は特別なことではなく、多かれ少なかれ、どこの組み込み開発でもアドホックに行われていることだと思います。しかし、デバッガと連携した汎用のしくみが最初から提供されることにより、CPU 占有時間の計算やイベントの抽出・マスク機能など、高度な表示や統計・解析機能が簡便に使えるようになり、工数が削減できます。また、しくみが共通化されることにより、デバッグの属人性が薄まり、ノウハウの共通化が可能になるため、開発そのものだけではなく、技術教育面などにも恩恵があると考えられます。