5 製品別サポート 5 DT10&DT-Storage 5 チュートリアル 5 応用編 5 ドライバのカスタム手法のご提案 5 テストポイントの通過情報をビット管理するドライバ

チュートリアル

テストポイントの通過情報をビット管理するドライバ

課題

カバレッジを取得したいが、ログデータの容量を減らしたい。
全てのテストポイントを毎回出力すると動作が重くなるので、出力する回数を減らしたい。

 

解決方法

ビット単位で、テストポイントの通過/非通過情報を管理し、通過履歴のあるデータの出力を制御するドライバを使用します。

ドライバでバッファを変数とし、領域を確保します。
テストポイントを通過するときに、テストポイントの二つの引数から”キー”を作り、
バッファの中の”キー”で指定したビットに「通過した」情報として 1 を書き込みます。

溜まったバッファから出力するときは、1 ビットずつ 1 か 0 かを見て、
ビットが 1 の時に”キー”の逆変換を行いテストポイントの情報に戻し、接続方式に合わせて出力するようにします。

通常テストポイントのみが対象となります。変数値出力ポイントなどの他のテストポイントは対象外になります。
ビット単位で通過/非通過のみを管理するため、通過時間などの情報は残りません。
C1カバレッジはC1カバレッジ(クイック)の場合は算出可能です。※
C0 カバレッジ、ステートメントカバレッジ、ディシジョンカバレッジは算出可能です。

※ C1カバレッジ(クイック)は環境設定の「ソースコードの分岐解析及びルート推定をしない」にチェックを付けて解析します。
C1カバレッジ(クイック)の算出方法につきましては、アプリヘルプをご参照ください。

 

効果

一度通過したテストポイントのデータは出力しないため、出力にかかるオーバーヘッドを減らせます。
また、ログを保存する PC 側のハードディスクの容量も減らせます。
大規模な環境でのカバレッジ計測において、ログデータの容量を抑えた運用ができます。

 

ドライバのカスタム方法

1. サンプルドライバのダウンロード
対応OS 接続方式 言語 イベントID出力方式 ダウンロード
Linux Ethernet接続 C/C++ イベントID出力ポイント挿入 ダウンロード
2. defineの設定

使用する定義を下記のように変更します。

#define DT_UINT_BIT_SIZE   32
#define MAX_FILE_NUM  4096
#define MAX_TP_NUM_PER_FILE  1024

#define DT_UINT_BIT_SIZE

ターゲットシステム上の unsigned int 型のビットサイズを指定します。

#define MAX_FILE_NUM

DT10 に登録するファイル数、もしくは、ベースアドレスの最大値を 4bit 右シフトした値を指定します。
ベースアドレスの最大値の確認方法を以下に説明します。
DT10 にファイルを登録した後、[レポート解析]→[テストレポートフィルタ]を選択します。
“ソース”のチェックボックスを ON、”設定値”の項目をダブルクリックし、表示されるダイアログ(下図)から確認できます。

テストレポートフィルタ

#define MAX_TP_NUM_PER_FILE

ファイル内にあるテストポイントの最大数を指定します。
テストポイントの最大数の確認方法を以下に説明します。
テストポイントを埋め込んだあと、[ツール]→[DTPlannerを開く]から DTPlanner を開き、 下図のように各ファイルの “ステップ” を参照すると最大数を確認できます。

4. _TP_DataOut 関数の実装

溜まったテストポイントの通過情報(バッファ)を出力する関数として、_TP_DataOut 関数を実装し、その関数を呼び出す必要があります。
サンプルドライバ内には既にご用意していますので、実行させるターゲットプログラムの任意の場所で_TP_DataOut 関数をコールするようにターゲットのソースコードに追加します。

例として、ターゲット機器の操作ボタンを押した時などの外部トリガーを発生させやすい箇所や、定周期で実行される関数に実装します。
Ethernet 接続以外の場合には、本ページ下部にある「他の接続で使う場合の適用方法」の項目を参考に _TP_DataOut 関数を変更してください。

5. データ取得と解析

ドライバとターゲットプログラムの実装後、DT10 アプリでテスト実行し、データ取得中の状態で、ターゲットプログラムを実行します。
_TP_DataOut 関数が実行されると、テストレポート上にデータが表示されます。

3-3H

取得されるデータは、ソースコード上にあるテストポイントの上からの順番で、通過したテストポイントだけとなります。
実行された順序でテストレポートに表示されませんのでご注意ください。
通過した情報から C0 カバレッジを算出するため、DT10 アプリケーションの[レポート解析]→[レポートデータの解析]を行い、カバレッジレポートを表示させます。

3-4H

6. データの取得について

カスタムしたドライバを実装して、データ取得します。
DT10アプリでテスト実行中に、 _TP_DataOut関数をコールし、取り溜めたデータを出力させることで、テストレポートが取得できます。
_TP_DataOut関数がコールされるまでは、テストレポートは取得されません。

 

他の接続方式で使用する場合の適用方法

サンプルドライバは、Ethernet 接続向けになっていますが、_TP_DataOut 関数を下記のように変更すれば、他の接続方式においても使用できます。
※OS によりコールする関数が異なる場合があります。

▼ 非同期バス接続の場合


void _TP_DataOut(void)
{
     unsigned int i, j;
     unsigned int addr, dat, key;
     unsigned char buff[DT_NRMLTP_SIZE];

   for( i = 0; i < MAX_LOG_BIT_SIZE; i++ ){
         for( j = 0; j < DT_UINT_BIT_SIZE; j++ ){
             if( logBitBuf[i] & (1 << j) ){
                 key = (i * DT_UINT_BIT_SIZE) + j;
                 dat = key % MAX_TP_NUM_PER_FILE;
                 addr = ((key / MAX_TP_NUM_PER_FILE) << 4); 
                
                 _TP_BusOutDrv( addr, dat );
             }
         }
     }
}

▼汎用ポート接続の場合


void _TP_DataOut(void)
{
    unsigned int i, j; 
    unsigned int addr, dat, key;
    unsigned char buff[DT_NRMLTP_SIZE];

    portInit();
    enterCritical();
    for( i = 0; i < MAX_LOG_BIT_SIZE; i++ ){
         for( j = 0; j < DT_UINT_BIT_SIZE; j++ ){
             if( logBitBuf[i] & (1 << j) ){
                 key = (i * DT_UINT_BIT_SIZE) + j;
                 dat = key % MAX_TP_NUM_PER_FILE;
                 addr = ((key / MAX_TP_NUM_PER_FILE) << 4);

                 _TP_BusOutDrv( addr, dat );
             }
         }
    }
    exitCritical();
} 

▼ファイル書き出しの場合(4Byte フォーマットを使用します。)

void _TP_DataOut(void)
{
     unsigned char buff[4] = {0};

     if (BusoutMode == 0) {
         /* Customize File Path */
         dat_file = fopen("ConvertData.DAT", "wb+");
         if (dat_file == NULL) {
             return;
         }
         BusOutModeSet(1);
     }

      for( i = 0; i < MAX_LOG_BIT_SIZE; i++ ){
          for( j = 0; j < DT_UINT_BIT_SIZE; j++ ){
              if( logBitBuf[i] & (1 << j) ){
                  key = (i * DT_UINT_BIT_SIZE) + j;
                  dat = key % MAX_TP_NUM_PER_FILE;
                  addr = ((key / MAX_TP_NUM_PER_FILE) << 4); 
                  buff[0] = (unsigned char)((dat) & 0xFF);
                  buff[1] = (unsigned char)((dat >> 8) & 0xFF);
                  buff[2] = (unsigned char)((addr) & 0xFF);
                  buff[3] = (unsigned char)((addr >> 8) & 0xFF);
                  
                  fwrite(buff, sizeof(char), 16, dat_file);
                  if (BusoutMode == 2){
                     fclose(dat_file);
                  }
              }
          }
      }
}

▼UART 接続の場合

void _TP_DataOut(void)
{
     unsigned int i, j, k;
     unsigned int addr, dat, key;
     unsigned char TmpBuf[9];

     for( i = 0; i < MAX_LOG_BIT_SIZE; i++ ){
         for( j = 0; j < DT_UINT_BIT_SIZE; j++ ){
             if( logBitBuf[i] & (1 << j) ){
                 key = (i * DT_UINT_BIT_SIZE) + j;
                 dat = key % MAX_TP_NUM_PER_FILE;
                 addr = ((key / MAX_TP_NUM_PER_FILE) << 4);
                 TmpBuf[0] = STX;               // STX
                 TmpBuf[1] = CMD_TESTPOINT;     // RS-232C Test Point COMMAND
                 TmpBuf[2] = (dat >> 8)& 0x00FF;  // D1
                 TmpBuf[3] = (dat)& 0x00FF;       // D0
                 TmpBuf[4] = (addr >>16)& 0x00FF; // A2
                 TmpBuf[5] = (addr >> 8)& 0x00FF; // A1
                 TmpBuf[6] = (addr)& 0x00FF;      // A0
                 TmpBuf[7] = CMD_TESTPOINT;      // Check-SUM
                 for( k = 2; k < 7; k++){
                    TmpBuf[7] ^= TmpBuf[k];
                 }
                 TmpBuf[8] = ETX;             // ETX
                 fwrite( TmpBuf, 1, 9, stdout );
             }
         }
     }
}