5 製品別サポート 5 DT10&DT-Storage 5 チュートリアル 5 応用編 5 ドライバのカスタム手法のご提案 5 スレッドを使用して定周期でデータ出力をするファイル書き出しドライバ

チュートリアル

スレッドを使用して定周期でデータ出力をするファイル書き出しドライバ

課題

・ファイル書き出し方式において、オーバーヘッドをより小さくして使用したい。
・タクトタイムがシビアな処理の経路解析と実行時間の測定を行いたい。 

解決方法

バッファに経路情報と通過時間を蓄積し、後から出力するドライバを使用します。
標準のサンプルドライバでは、テストポイントを通過する度にデータをファイルに出力しますが、
ドライバ内でメモリバッファを確保して、テストポイントの処理実行時にはバッファにデータ記録のみを行います。
蓄積されたデータを定周期で実行されるスレッドを使用してファイルに書き込むことで、
標準のサンプルドライバよりも、オーバーヘッドを減らすことができます。

 

効果

テストポイント処理の時は、メモリバッファへのデータ記録のみをするので、
テストポイント通過時の処理のオーバーヘッドを通常にくらべて短縮する事ができます。

 

ドライバのカスタム方法

1. サンプルドライバのダウンロード
対応OS 接続方式 言語 イベントID出力方式 ダウンロード
Linux ファイル書き出し C/C++ ドライバ対応方式 ダウンロード
2. カスタムドライバの概要

今回のカスタムドライバでは、以下の要件を目的としています。
①ファイル書き出し方式におけるオーバヘッドの影響を最小限に抑える。
②バッファ(あるいはリングバッファ)にテストレポートをためておき、定周期でファイルに出力する。

こちらがサンプルドライバの全体像です。

3. defineの設定

変更内容のコントロール等に必要なヘッダファイルをIncludeします。

/*===========================================*/
/*  Desc:   Please set buffer size */
/*===========================================*/
#define DT10_MAX_TESTREPORT_NUMBER  50000    /* Customize */

データを蓄積するバッファのサイズ等の定義しています。
ターゲット要件に合わせて、バッファに記録するテストレポート数を指定します。

/* 1 -> use ring buffer */
 #define DT10_USE_RING_BUFF  1
/* buffer overflow if end trace */
 #define DT10_BUFF_OVERFLOW_TRACE_END    0 

#define DT10_USE_RING_BUFF
バッファをリングバッファとして使用する場合、有効にします。

#define DT10_BUFF_OVERFLOW_TRACE_END
リングバッファ時にオーバーフローが発生した時に、古いレポートデータを削除して新たにデータを取得するか、
もしくは、データ取得を停止するかを設定できます。
データ取得を停止したい場合、有効にします。

4. 各関数の説明

*_TP_WriteFileThread関数
バッファに溜めたデータを定周期でファイルに出力しています。

_TP_BusOutInit関数
*_TP_WriteFileThread関数(スレッド)の周期設定をしています。

_TP_BusOutDrv関数
必要なデータをまとめてバッファに記録します。

5. イベント情報の取得について

サンプルドライバのイベント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
    pid = getpid();
#endif

イベント情報を記録している『event_id』は、サンプルドライバでは常時 0 となっています。
こちらもAPI関数等から、必要な情報を取得するように処理を変更してください。