Embedded Coder

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

コード カバレッジ指標の収集

この例では、コード カバレッジ指標の収集に SIL または PIL シミュレーション モードのいずれも使用できることを説明します。コード カバレッジの測定を有効にするには、BullseyeCoverage や LDRA Testbed のようなサポートされているコード カバレッジ ツールをインストールしなければなりません。次のスクリーンショットでは、コード カバレッジを有効にして SIL シミュレーションを実行した後に取得したコード カバレッジ レポートのサンプルを示します。注釈は選択したコード カバレッジ ツールに依存することに注意してください。

この例では、ノーマル モードのシミュレーション中にモデル カバレッジを測定して、同じシミュレーションを SIL モードで繰り返してコード カバレッジを測定する方法を説明します。モデル カバレッジおよびコード カバレッジのレポート内のハイパーリンクを使用して、モデル部分のモデル カバレッジおよびコード カバレッジの結果を比較できます。

この例のモデル カバレッジの部分を実行するには、Simulink Verification and Validation™ をインストールしておかなければなりません (詳細はドキュメンテーションを参照してください)。

この例のコード カバレッジの部分を実行するには、サポートされるコード カバレッジ ツールをインストールしておかなければなりません (詳細はドキュメンテーションを参照してください)。

rtwdemo_sil_pil_scriptrtwdemo_sil_pil_script も参照してください。

初期設定

% Make sure the model is freshly opened
model='rtwdemo_sil_topmodel';
close_system(model,0)
open_system(model)

% Remove existing build folders
buildFolder=RTW.getBuildDir(model);
if exist(buildFolder.BuildDirectory,'dir')
    rmdir(buildFolder.BuildDirectory,'s');
end

% Configure model coverage to 'off'. Change this setting to 'on' to
% generate a model coverage report.
set_param(model, 'RecordCoverage','off')
clear covCumulativeData

% Set up the stimulus data
T=0.1; % sample time
[ticks_to_count, reset, counter_mode, count_enable, ...
 counter_mode_values_run1, counter_mode_values_run2, ...
 count_enable_values_run1, count_enable_values_run2] = ...
    rtwdemo_sil_topmodel_data(T);

ノーマル モードでのシミュレーションの実行

モデルはモデル カバレッジ指標を収集するように設定されます。次のコマンドを入力して、シミュレーションを実行します。シミュレーションが完了したら、自動的に開くモデル カバレッジ レポートを見てください。 カバレッジ表示ウィンドウを使用して、モデル内のブロックからカバレッジ レポートの対応するセクションに移動します。

counter_mode.signals.values = counter_mode_values_run1;
count_enable.signals.values = count_enable_values_run1;
set_param(model,'SimulationMode','normal');

% Set up Simulation Data Inspector for interactive viewing and comparison of
% simulation results
Simulink.sdi.view;
Simulink.sdi.clear;

% Run the simulation
simout_normal_run1 = sim(model, 'ReturnWorkspaceOutputs', 'on');

% Capture the results
Simulink.sdi.createRun('Run 1 (normal mode)', 'namevalue',...
                       {'simout_normal_run1'}, {simout_normal_run1});

ノーマル モードでの 2 回目のシミュレーションの実行

最初のシミュレーションで、レポートには達成したカバレッジは 100% 未満であると示されています。次のコマンドを入力して、100% MC/DC カバレッジを達成するためにカバレッジのレベルを高める別の入力信号で、2 回目のシミュレーションを実行します。モデル カバレッジ レポートは、両方のシミュレーション実行の累積カバレッジを示すよう設定されていることに注意してください。

counter_mode.signals.values = counter_mode_values_run2;
count_enable.signals.values = count_enable_values_run2;
set_param(model,'SimulationMode','normal');

simout_normal_run2 = sim(model, 'ReturnWorkspaceOutputs', 'on');

Simulink.sdi.createRun('Run 2 (normal mode)', 'namevalue',...
                       {'simout_normal_run2'}, {simout_normal_run2});

コード カバレッジを測定するためのモデルの設定

SIL シミュレーションを実行する前に、次のコマンドを実行してコード カバレッジ ツールを使用できるかどうか確認し、コード カバレッジ指標を収集するようにモデルを設定します。

% Check for available code coverage tools:
covToolPath = '';
ldraPath = coder.coverage.LDRA.getPath;
bullseyePath = coder.coverage.BullseyeCoverage.getPath;

% Configure the model to collect coverage metrics if the coverage tool is
% available
coverageSettings = get_param(model,'CodeCoverageSettings');
coverageSettings.TopModelCoverage='on';
if ~isempty(ldraPath)
    coverageSettings.CoverageTool='LDRA Testbed';
elseif ~isempty(bullseyePath)
    coverageSettings.CoverageTool='BullseyeCoverage';
else
    coverageSettings.CoverageTool='None';
end
set_param(model,'CodeCoverageSettings',coverageSettings);
set_param(model,'CodeExecutionProfiling','on');

SIL モードでのシミュレーションの実行

ノーマル モード シミュレーションのカバレッジ指標では生成されたコードを使用しません。SIL シミュレーションで、生成されたコードで同じ入力スティミュラス信号を使用して、モデル カバレッジではなくコード カバレッジを測定できます。

次のコマンドを入力して SIL モードで最初の 2 つのシミュレーションを繰り返します。両方のシミュレーションが完了したら、コマンド ウィンドウのリンクをクリックしてコード カバレッジ レポートを開き、累積コード カバレッジ結果を表示します。リンクは、コード カバレッジ ツールをインストールしてある場合にのみ使用できます。

コード カバレッジ レポートのハイパーリンクを使用して、ブロック線図の対応する位置に戻ります。カバレッジ表示ウィンドウを使用して、モデル カバリッジ レポートの対応するセクションを直接開くことができます。

counter_mode.signals.values = counter_mode_values_run1;
count_enable.signals.values = count_enable_values_run1;
set_param(model,'SimulationMode','software-in-the-loop');

simout_sil_run1 = sim(model, 'ReturnWorkspaceOutputs', 'on');

Simulink.sdi.createRun('Run 1 (SIL mode)', 'namevalue',...
                       {'simout_sil_run1'}, {simout_sil_run1});

% Run the second simulation in SIL mode
counter_mode.signals.values = counter_mode_values_run2;
count_enable.signals.values = count_enable_values_run2;
set_param(model,'SimulationMode','software-in-the-loop');

simout_sil_run2 = sim(model, 'ReturnWorkspaceOutputs', 'on');

Simulink.sdi.createRun('Run 2 (SIL mode)', 'namevalue',...
                       {'simout_sil_run2'}, {simout_sil_run2});
### Starting build procedure for model: rtwdemo_sil_topmodel
### Successful completion of build procedure for model: rtwdemo_sil_topmodel
### Preparing to start SIL simulation ...
### Updating code generation report with SIL files ...
### Starting SIL simulation for component: rtwdemo_sil_topmodel
### Stopping SIL simulation for component: rtwdemo_sil_topmodel
### Starting build procedure for model: rtwdemo_sil_topmodel
### Generated code for 'rtwdemo_sil_topmodel' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of build procedure for model: rtwdemo_sil_topmodel
### Preparing to start SIL simulation ...
### Updating code generation report with SIL files ...
### Starting SIL simulation for component: rtwdemo_sil_topmodel
### Stopping SIL simulation for component: rtwdemo_sil_topmodel

シミュレーション データ インスペクター

シミュレーション データ インスペクターは自動的に開き、対話的な表示や結果の分析が可能です。[実行の比較] タブを使用して SIL モードおよびノーマル ノードに記録された信号が両方の実行で同一であることを確認します。これを次のスクリーンショットに示します。

コード実行のプロファイル

直近の SIL (または PIL) シミュレーションの各タイム ステップの実行時間を確認できます。

% The name of the execution profile variable is specified under Configuration
% Parameters > Code Generation > Verification in the "Code
% profiling" section.
executionProfile = simout_sil_run2.get('executionProfile') %#ok<NOPTS>
 
Code execution profiling data for rtwdemo_sil_topmodel. To open a report,
enter the command <a href="matlab: executionProfile.report">executionProfile.report</a>.
 

詳細情報

この例では、ノーマル モード シミュレーション中にモデル カバレッジを、SIL シミュレーション中にコード カバレッジを収集しました。コード カバレッジ レポートとモデル カバレッジ レポート間を移動して、両方のレポートの指標を相互に確認しました。次のリンクから、このトピックおよびその他のトピックの詳細を確認できます。