チュートリアル
テストポイントの通過情報をバッファに取り溜めてから出力するドライバ
課題
タクトタイムがシビアな処理の経路解析と実行時間の測定を行いたいが、ハードウェアの仕様上、高速な接続が使えず、オーバヘッドが大きくて該当処理にDT10が適用できない。
解決方法
バッファに経路情報と通過時間を蓄積し、後から出力するドライバを使用します。
このドライバは、通常のドライバのようにテストポイントを通過する度に出力するのではなく、ドライバ内でメモリバッファを確保し、通常の実行時にはバッファに記録のみ行います。
別途、出力関数をコールする時にまとめて出力する事で、ターゲットの処理に負荷を掛けないタイミングで、データの出力ができるようになります。
また、バッファに記録する場合は、DynamicTracerのタイムスタンプ機能を使用しても有効なデータが得られません。ターゲット側の時間情報を取得し、これを合わせて出力します。
効果
通常のテストポイント処理時は、メモリバッファへの記録のみとなります。
そのため、通常の出力にくらべて、オーバーヘッドを削減する事ができます。
また、バッファをリングバッファにしたり、データ取得の開始・停止位置を工夫する事で、特定の条件の経路情報を取得するといったこともできるようになります。
ドライバのカスタム方法
1. サンプルドライバのダウンロード
対応OS | 接続方式 | 言語 | イベントID出力方式 | ダウンロード |
---|---|---|---|---|
Non-OS/iTron | GPIO 4bit 接続 | C/C++ | ドライバ対応方式 | ダウンロード |
2. カスタムドライバの概要
今回のカスタムドライバでは、以下の要件を目的としております。
①通常ではオーバヘッドの影響の影響が出てしまう、タクトタイムの厳しい処理の経路を取得する。
②バッファ(あるいはリングバッファ)にテストレポートをためておき、任意のタイミングで出力させる。
3. defineの設定
変更内容のコントロール等に必要なヘッダファイルをIncludeします。
サンプルドライバは、例として”Common.h”をincludeしています。削除するか、コメントアウトしてください。
/*------------------------------------------------------------------------------*/
/* Desc: Header for Port Controll */
/*------------------------------------------------------------------------------*/
#include "Common.h"
データを蓄積するバッファのサイズ等を定義しています。
/*------------------------------------------------------------------------------*/
/* Desc: Please set Buffer Size and Option Setthings */
/*------------------------------------------------------------------------------*/
#define RING_BUFF_USE 0 /* Use RingBuffer */
#define REPORT_COUNT 100 /* TP's recode Line num */
#define RING_BUFF_USE
バッファをリングバッファにする場合、このフラグを有効にします。
#define REPORT_COUNT
バッファに記録するテストレポート数を定義します。ターゲット要件に合わせて変更します。
4. 各関数の説明
_TP_BufCpy 関数
_TP_BusOut関数からコールされ、_TP_BusOut関数の内容をバッファに書き込みます。
この時、#define RING_BUFF_USE を有効にしていると、バッファが1周した時点でフラグを立てて、
時間情報がバッファ内で逆転している事を記憶しておきます。
_TP_BusOut 関数
必要なデータをまとめて記録し、_TP_BufCpy関数をコールして、バッファに書き込んでいます。
_TP_DataOut 関数
バッファに蓄積したデータの出力を行う場合は、別途、この _TP_DataOut関数をコールする必要があります。
リングバッファが有効であれば現在位置から出力し、そうでなければバッファ先頭からデータを出力していきます。
最後にinitを0にして、次回コール時にバッファの初期化が行われます。
5. ターゲット側の時間情報を取得するためのアプリ設定
通常DT10のタイムスタンプは、DynamicTracerのタイムスタンプを使用しますが、
今回のようにバッファに蓄積した場合は、ターゲット側から時間情報を取得しなければ、正しい結果が得られません。
ターゲット側の時間情報を使用する際は、DT10アプリ上で以下の設定を行う必要があります。
● DT10アプリケーションの設定
メニュー [テスト実行] から [GPIO/SPI接続設定]を選択します。
※現在のプロジェクト設定でご選択中の接続方式のみ有効になります。
● 1カウントあたりの時間を設定する。
開いたダイアログをから『経過時間データはターゲットプログラムで取得する』 にチェックし
[0x1] あたりの時間値を定義します。なお、時間値の粒度はターゲット側の時間値の精度に依存します。
● ドライバファイルのdefine設定
ドライバ側では、以下のdefineを有効にします。
/*-----------------------------------------------------------------------------------------*/
/* Macro: DT_ADD_TIME_INFO */
/* Desc: Please set 1 if use TARGET SYSTEM TIME information with Test Point. */
/*-----------------------------------------------------------------------------------------*/
#define DT_ADD_TIME_INFO 1
上記のdefineを変更した時は、TP_BusOut関数内の記述を変更する必要があります。
#if DT_ADD_TIME_INFO
/* Please customize here When if get time Information */
time++;
buff[count++] = (unsigned char)((time >> 0) & 0xFF); /* time Lower1byte */
buff[count++] = (unsigned char)((time >> 8) & 0xFF); /* time Lower2byte */
buff[count++] = (unsigned char)((time >> 16) & 0xFF); /* time Upper1byte */
buff[count++] = (unsigned char)((time >> 24) & 0xFF); /* time Upper2byte */
#endif /* DT_ADD_TIME_INFO */
6. データの取得について
カスタムしたドライバを実装して、データ取得します。
DT10アプリでテスト実行中に、 _TP_DataOut関数をコールし、取り溜めたデータを出力させることで、テストレポートが取得できます。
_TP_DataOut関数がコールされるまでは、テストレポートは取得されません。
7. イベント情報の取得について
サンプルドライバのイベントID出力方式は、「ドライバ対応方式」になっています。
サンプルドライバをそのまま使用して、イベント情報の取得を行う際は、
アプリのプロジェクト設定において、イベントID出力方式が、以下の設定になっていることを確認してください。
また、ドライバファイル側では、以下のdefineを有効にします。
/*-----------------------------------------------------------------------------------*/
/* Macro: DT_ADD_EVENT_INFO */
/* Desc: Please set 1 if use EVENT TRACE DATA with Test Point. */
/*-----------------------------------------------------------------------------------*/
#define DT_ADD_EVENT_INFO 0
上記のdefineを変更した時は、TP_BusOut関数内の記述を変更する必要があります。
#if DT_ADD_EVENT_INFO
/* Please customize here When if get Event Information */
event_id = 0;
buff[count++] = (unsigned char)((event_id >> 0) & 0xFF); /* EventInfo Lower1byte */
buff[count++] = (unsigned char)((event_id >> 8) & 0xFF); /* EventInfo Lower2byte */
buff[count++] = (unsigned char)((event_id >> 16) & 0xFF); /* EventInfo Upper1byte */
buff[count++] = (unsigned char)((event_id >> 24) & 0xFF); /* EventInfo Upper2byte */
#endif /* DT_ADD_EVENT_INFO */
イベント情報を記録している『event_id』は、サンプルドライバでは常時 0 となっています。
こちらもAPI関数等から、必要な情報を取得するように処理を変更してください。