主要内容

使用第三方工具收集代码覆盖率度量

如果您有 Simulink® Coverage™ 许可证,可以在软件在环 (SIL) 或处理器在环 (PIL) 仿真期间收集代码覆盖率度量 - 请参阅收集代码的覆盖率 (Simulink Coverage)。此示例说明如何可以使用第三方工具(即 BullseyeCoverage 或 LDRA 工具套件)收集代码覆盖率度量。您必须安装第三方工具 - 请参阅代码覆盖率工具支持

您在普通模式仿真期间测量模型覆盖率,然后在 SIL 仿真中使用第三方工具收集生成代码的覆盖率度量。通过使用模型覆盖率和代码覆盖率报告中的超链接,您可以比较模型覆盖率和代码覆盖率结果。有关 SIL 仿真的详细信息,请参阅用 SIL 和 PIL 仿真测试生成的代码

初始设置

打开模型 SILTopModel

openExample('ecoder/SILPILVerificationExample', ...
             supportingFile='SILTopModel.slx')
model='SILTopModel';

删除现有编译文件夹。

buildFolder=RTW.getBuildDir(model);
if exist(buildFolder.BuildDirectory,'dir')
    rmdir(buildFolder.BuildDirectory,'s');
end

配置模型覆盖率报告的生成设置。

set_param(model, 'RecordCoverage','on')
clear covCumulativeData

通过运行函数 SILTopModelData 来设置激励数据。

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] = ...
    SILTopModelData(T);

在普通模式下运行仿真

该模型配置为收集模型覆盖率度量。仿真完成后,将打开模型覆盖率报告。使用覆盖率显示窗口从模型中的模块导航到覆盖率报告的相应部分。

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

设置仿真数据检查器以交互式查看和比较仿真结果。

Simulink.sdi.view;
Simulink.sdi.clear;

运行仿真。

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

捕获结果。

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

在普通模式下运行第二次仿真

对于第一次仿真,报告显示实现的覆盖率小于 100%。使用不同输入信号运行第二次仿真,将 MC/DC 覆盖率水平提高到 100%。请注意,模型覆盖率报告配置为显示两个仿真运行的累积覆盖率。

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 仿真之前,请检查第三方工具的可用性,并配置模型以收集代码覆盖率度量。如果第三方工具不可用,则模型将使用 Simulink Coverage

covToolPath = '';
ldraPath = coder.coverage.LDRA.getPath;
bullseyePath = coder.coverage.BullseyeCoverage.getPath;

coverageSettings = get_param(model,'CodeCoverageSettings');
coverageSettings.TopModelCoverage='on';
if ~isempty(ldraPath)
    coverageSettings.CoverageTool='LDRAcover or LDRA tool suite';
elseif ~isempty(bullseyePath)
    coverageSettings.CoverageTool='BullseyeCoverage';
else
    coverageSettings.CoverageTool='None';
end
set_param(model,'CodeCoverageSettings',coverageSettings);

在 SIL 模式下运行仿真

普通模式仿真得出了模型的覆盖率度量。使用 SIL 仿真,您可以对生成的代码应用相同的输入激励信号并测量代码覆盖率。

在 SIL 模式下运行第一个仿真。

counter_mode.signals.values = counter_mode_values_run1;
count_enable.signals.values = count_enable_values_run1;
set_param(model,'SimulationMode','software-in-the-loop');
set_param(model,'CodeExecutionProfiling','off');
set_param(model,'CodeProfilingInstrumentation','off');
simout_sil_run1 = sim(model, 'ReturnWorkspaceOutputs', 'on');
Simulink.sdi.createRun('Run 1 (SIL mode)', 'namevalue',...
                       {'simout_sil_run1'}, {simout_sil_run1});

在 SIL 模式下运行第二个仿真。

counter_mode.signals.values = counter_mode_values_run2;
count_enable.signals.values = count_enable_values_run2;
set_param(model,'SimulationMode','software-in-the-loop');
set_param(model,'CodeExecutionProfiling','off');
set_param(model,'CodeProfilingInstrumentation','off');
simout_sil_run2 = sim(model, 'ReturnWorkspaceOutputs', 'on');
Simulink.sdi.createRun('Run 2 (SIL mode)', 'namevalue',...
                       {'simout_sil_run2'}, {simout_sil_run2});

仿真完成后,点击命令行窗口中的链接以打开代码覆盖率报告,并查看累积代码覆盖率结果。只有安装了第三方工具,该链接才可用。

使用代码覆盖率报告中的超链接可以转到模块图中的相应位置。然后,通过使用覆盖率显示窗口,您可以打开模型覆盖率报告的相应部分。比较模型覆盖率和代码覆盖率结果。

仿真数据检查器会自动打开,从而允许以交互方式查看和分析结果。使用“比较”和“检查”窗格确认 SIL 和普通模式记录的信号在两次运行中是相同的。

结语

在此示例中,您执行了下列操作:

  • 在普通模式仿真期间收集模型覆盖率度量。

  • 在 SIL 仿真期间收集代码覆盖率度量。

  • 在代码覆盖率和模型覆盖率报告之间进行导航。

  • 交叉检查两个报告中的各项度量。

另请参阅

主题