Соберите метрики покрытия кода с Simulink® Coverage™

В этом примере показано, как собрать метрики покрытия кода во время программного обеспечения в цикле (SIL) или процессор в цикле (PIL) симуляция с Simulink® Coverage™.

Вы используете инструмент покрытия кода, и покрытие кода сообщают, чтобы просмотреть записанное покрытие кода для SIL симуляции.

В этом примере вы измеряете покрытие модели во время симуляции в режиме normal mode, повторяете ту же симуляцию в режиме SIL и сравниваете записанные метрики от обеих симуляций.

Сравните покрытие модели и результаты покрытия кода при помощи гиперссылок в отчетах покрытия кода и покрытии модели.

Для большего количества примеров измерения SIL симуляций и PIL симуляций, смотрите Тестовый Сгенерированный код с SIL симуляциями и PIL симуляциями (Embedded Coder).

Начальная настройка

Откройте модель.

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

Удалите любые существующие папки сборки.

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

Сконфигурируйте модель для набора покрытия.

set_param(model, 'CovEnable', '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);

Запустите первую симуляцию в режиме normal mode

После того, как симуляция завершается, отчет покрытия модели открывается. Чтобы перейти от блоков в модели к соответствующим разделам отчета покрытия, используйте окно экрана покрытия.

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

Подсветите модель.

cvmodelview(simout_normal_run1.covdata);

Получите результаты.

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

Запустите вторую симуляцию в режиме normal mode

Для первой симуляции отчет показывает, что модель достигла меньше чем 100%-го покрытия MCDC. Запустите вторую симуляцию с различными входными сигналами, чтобы увеличить уровень покрытия MCDC к 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');

cvmodelview(simout_normal_run2.covdata);

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

Сконфигурируйте модель, чтобы измерить покрытие кода

Прежде, чем запустить SIL симуляцию, сконфигурируйте модель, чтобы собрать метрики покрытия кода.

coverageSettings = get_param(model, 'CodeCoverageSettings');
coverageSettings.CoverageTool = 'Simulink Coverage';
coverageSettings.TopModelCoverage = 'on';
set_param(model, 'CodeCoverageSettings', coverageSettings);

Запустите первую симуляцию в режиме SIL

Можно использовать те же входные сигналы в SIL симуляции, которую вы использовали во время первой симуляции, запущенной в режиме normal mode.

Запустите первую симуляцию в режиме 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');
### 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 22.186s
### Preparing to start SIL simulation ...
Building with 'gcc'.
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
cvmodelview(simout_sil_run1.covdata);
Simulink.sdi.createRun('Run 1 (SIL mode)', 'namevalue',...
                       {'simout_sil_run1'}, {simout_sil_run1});

Когда симуляция завершится, просмотрите результаты покрытия кода на модели при помощи выделения покрытия. Чтобы видеть сводные данные покрытия кода SIL для элемента модели, установите свой курсор на элемент модели.

Можно также просмотреть результаты покрытия кода в отчете покрытия кода HTML. Итоговый раздел показывает, что все функции были вызваны, но запущенная SIL симуляция не достигла полного охвата для решения, условия или покрытия MCDC.

cvhtml('codecovreport',simout_sil_run1.covdata);

Чтобы перейти к соответствующим элементам модели в блок-схеме, используйте гиперссылки в отчете покрытия кода

Запустите режим Second Simulation in SIL

Используйте те же входные сигналы в SIL симуляции, которую вы использовали во второй симуляции, запущенной в режиме normal 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');
set_param(model, 'CodeExecutionProfiling', 'off');
set_param(model, 'CodeProfilingInstrumentation', 'off');
simout_sil_run2 = sim(model, 'ReturnWorkspaceOutputs', 'on');
### 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 2.9711s
### 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
Simulink.sdi.createRun('Run 2 (SIL mode)', 'namevalue',...
                       {'simout_sil_run2'}, {simout_sil_run2});

Подсветите модель с помощью совокупного покрытия от обеих симуляций режима SIL, чтобы видеть, что сгенерированный код из модели достиг полного охвата.

cvmodelview(simout_sil_run1.covdata + simout_sil_run2.covdata);

Сравните метрики от нормальных и SIL симуляций

Инспектор Данных моделирования открывается автоматически после каждого запуска, который позволяет вам просматривать и анализировать результаты. Чтобы подтвердить, что регистрируемые сигналы для SIL и запусков режима normal mode идентичны, рассмотрите информацию в Сравнивании и панелях Inspect.

Для просмотра документации необходимо авторизоваться на сайте