2022/4/7
製品
カテゴリー
タグ
1557 Views
スレッドを使用して定周期でデータ出力をするファイル書き出しドライバ
Contents
課題
- ファイル書き出し方式において、オーバーヘッドをより小さくして使用したい
- タクトタイムがシビアな処理の経路解析と実行時間の測定を行いたい。
解決方法
バッファに経路情報と通過時間を蓄積し、後から出力するドライバを使用します。
標準のサンプルドライバでは、テストポイントを通過する度にデータファイルに出力しますが、
ドライバ内でメモリバッファを確保して、テストポイントの処理実行時にはバッファにデータ記録のみを行います。
蓄積されたデータを定周期で実行されるスレッドを使用してファイルに書き込むことで、
標準のサンプルドライバよりも、オーバーヘッドを減らすことができます。
効果
テストポイント処理の時は、メモリバッファへのデータ記録のみをするので、
テストポイント通過時の処理のオーバーヘッドを通常に比べて短縮することができます。
手順
サンプルドライバのダウンロード
対応OS | 接続方式 | 言語 | イベントID出力方式 | ダウンロード |
---|---|---|---|---|
Linux | ファイル書き出し | C/C++ | ドライバ対応方式 | ダウンロード |
カスタムドライバの概要
今回のカスタムドライバでは、以下の要件を目的としてます。
-
ファイル書き出し方式におけるオーバーヘッドの影響を最小限に抑える。
-
バッファ(あるいはリングバッファ)にテストレポートを溜めて置き、定周期でファイルに出力する。
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 DT_USE_RING_BUFF
バッファをリングバッファとして使用する場合、有効にします。
-
#define DT_BUFF_OVERFLOW_TRACE_END
リングバッファ時にオーバーフローが発生した時に、古いレポートデータを削除して新たにデータを取得するか、もしくはデータ取得を停止するかを設定できます。
データ取得を停止したい場合、有効にします。
各関数の説明
-
*_TP_WriteFileThread関数
バッファに溜めたデータを定周期でファイルに出力しています。
-
_TP_BusOutInit関数
*_TP_WriteFileThread関数(スレッド)の周期設定をしています。
-
_TP_BusOutDrv関数
必要なデータをまとめてバッファに記録します。
イベント情報の取得について
サンプルドライバのイベント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関数等から、必要な情報を取得するように処理を変更してください。