使用第三方工具收集代码覆盖率度量
如果您有 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 仿真期间收集代码覆盖率度量。
在代码覆盖率和模型覆盖率报告之间进行导航。
交叉检查两个报告中的各项度量。