Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

使用第三方工具收集代码覆盖率指标

如果安装了 Simulink® Coverage™,您可以在软件在环 (SIL) 或处理器在环 (PIL) 仿真期间收集代码覆盖率指标 - 请参阅Collect Coverage for Code (Simulink Coverage)。在此示例中,您可以使用第三方工具(例如 BullseyeCoverage 或 LDRA 工具套件)收集代码覆盖率指标。您必须安装第三方工具 - 请参阅Code Coverage Tool Support

此屏幕截图显示在启用代码覆盖工具的情况下运行 SIL 仿真获得的代码覆盖率报告。注释取决于您指定的代码覆盖率工具。

在此示例中,您将在普通模式仿真期间测量模型覆盖率,并在 SIL 模式下重复相同的仿真以测量代码覆盖率。通过使用模型覆盖率和代码覆盖率报告中的超链接,您可以比较模型覆盖率和代码覆盖率结果。

对于 SIL 和 PIL 仿真示例,请参阅用 SIL 和 PIL 仿真测试生成的代码

初始设置

确保模型是新打开的。

model='rtwdemo_sil_topmodel';
close_system(model,0)
open_system(model)

删除现有编译文件夹。

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

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

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

设置激励数据。

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');

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

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® Verification and Validation™。

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});
### Starting build procedure for: rtwdemo_sil_topmodel
### Successful completion of build procedure for: rtwdemo_sil_topmodel

Build Summary

Top model targets built:

Model                 Action                       Rebuild Reason                                    
=====================================================================================================
rtwdemo_sil_topmodel  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 44.156s
### Preparing to start SIL simulation ...
Building with 'MinGW64 Compiler (C)'.
MEX completed successfully.
### Updating code generation report with SIL files ...
### Starting SIL simulation for component: rtwdemo_sil_topmodel
### Stopping SIL simulation for component: rtwdemo_sil_topmodel
### Completed code coverage analysis

在 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});
### Starting build procedure for: 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: rtwdemo_sil_topmodel

Build Summary

Top model targets built:

Model                 Action         Rebuild Reason                           
==============================================================================
rtwdemo_sil_topmodel  Code compiled  Compilation artifacts were out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 3.656s
### Preparing to start SIL simulation ...
### Starting SIL simulation for component: rtwdemo_sil_topmodel
### Stopping SIL simulation for component: rtwdemo_sil_topmodel
### Completed code coverage analysis

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

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

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

结语

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

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

  • 在 SIL 仿真期间收集代码覆盖率指标。

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

  • 交叉检查两个报告中的各项指标。

相关主题