Пакет: slcoverage
Выберите пользовательский код C or C++ для фильтра покрытия
Использование объектов slcoverage.CodeSelector Класс, чтобы задать пользовательские критерии выбора кода C or C++ для правила фильтра.
The slcoverage.CodeSelector класс является handle класс.
sel = slcoverage.CodeSelector(type,fileName) создает CodeSelector объект заданного type на основе заданного fileName и устанавливает Type и FileName свойства.
sel = slcoverage.CodeSelector(type,fileName,functionName) создает CodeSelector объект на основе заданных functionName C или C++ в файле и устанавливает FunctionName свойство.
sel = slcoverage.CodeSelector(type,fileName,functionName,expr,exprIndex) создает CodeSelector объект для указанного индекса выражения и выражения и наборов Expr и ExprIndex свойства.
sel = slcoverage.CodeSelector(type,fileName,functionName,expr,exprIndex,outcomeIndex) создает CodeSelector объект на основе заданного результата покрытия и устанавливает OutcomeIndex свойство.
sel = slcoverage.CodeSelector(type,fileName,functionName,expr,exprIndex,outcomeIndex,parentExprIndex) создает CodeSelector объект на основе заданного результата покрытия, который принадлежит выражению, принадлежащему parentExprIndex и устанавливает DecOrCondIndex свойство к parentExprIndex.
Type - Тип пользовательского кода C or C++ для выбораslcoverage.CodeSelectorType значениеТип пользовательского кода C or C++ для выбора, заданный как перечисление slcoverage.CodeSelectorType класс:
slcoverage.CodeSelectorType.File - Настраиваемое имя файла кода C or C++.
slcoverage.CodeSelectorType.Function - Настраиваемое имя функции кода C or C++.
slcoverage.CodeSelectorType.Decision - Пользовательское решение кода C или C++.
slcoverage.CodeSelectorType.Condition - Пользовательское условие кода C or C++.
slcoverage.CodeSelectorType.DecisionOutcome - Пользовательский результат принятия решения по коду C or C++.
slcoverage.CodeSelectorType.ConditionOutcome - Пользовательский результат условия кода C or C++.
slcoverage.CodeSelectorType.MCDCOutcome - Пользовательский результат MCDC кода C или C++.
slcoverage.CodeSelectorType.RelationalBoundaryOutcome - Пользовательский результат реляционной границы кода C или C++.
Пример: slcoverage.CodeSelectorType.Function
SetAccess | protected |
Типы данных: slcoverage.CodeSelectorType
FileName - Файл C или C++ для выбораФайл C или C++ для выбора, заданный как символьный массив или строковые массивы.
Пример: 'myfile.c'
SetAccess | protected |
Типы данных: char | string
FunctionName - функция C или C++ для выбораФункция C или C++ для выбора, заданная как символьный массив или строковые массивы.
Пример: 'counterbusFcn'
SetAccess | protected |
Типы данных: char | string
Expr - Решение или выражение условия для выбораРешение или выражение условия для выбора, заданное как символьный массив или строковые массивы.
Пример: 'x | y'
SetAccess | protected |
Типы данных: char | string
ExprIndex - Индекс выраженияИндекс выражения, заданный как целое число. Если вы фильтруете результат, это свойство является индексом выражения, которому принадлежит этот результат. Если вы фильтруете выражение, это свойство является индексом этого выражения в теле функции.
Пример: 2
SetAccess | protected |
Типы данных: single | double | int
OutcomeIndex - Индекс выбранного результатаИндекс выбранного результата, заданный как целое число:
Для логического выражения введите 1 для F результат или 2 для T результат.
Для оператора switch/case введите 1 для первого случая, 2 для второго случая и так далее.
Для реляционного контура
Целый тип:
введите 1 для типа -1.
введите 2 для типа +1.
введите 3 для типа 0.
Тип с плавающей точкой:
введите 1 для [-tol 0] или [-tol 0).
введите 2 для (0 tol] или [0 tol] является результатом 2
Для получения дополнительной информации о реляционном граничном покрытии см. «Реляционное граничное покрытие».
Пример: 2
SetAccess | protected |
Типы данных: single | double | int
DecOrCondIndex - Индекс родительского выраженияИндекс родительского выражения, заданный как целое число. Используйте этот вход при фильтрации выражения, принадлежащего родительскому решению или условию. Это свойство является индексом родительского решения или условия относительно функции.
Пример: 2
SetAccess | protected |
Типы данных: single | double | int
ConstructorCode - Код, используемый для создания этого объекта селектораКод, используемый для создания этого объекта селектора, возвращенный как вектор символов.
SetAccess | protected |
Description - Описание селектораОписание селектора, возвращаемое как вектор символов. Simulink® Coverage™ создает описание на основе селектора.
SetAccess | protected |
Id - Идентификатор элемента моделиЭто свойство пустое для slcoverage.CodeSelector класс.
SetAccess | protected |
Типы данных: char | string | handle | integer
allSelectors | Селекторы для модели или элемента кода |
В этом примере показано, как выбрать пользовательский код C or C++, для которого вы хотите добавить правило фильтра.
Загрузите модель.
modelName = 'slcovCCallerExample'; Simulink.importExternalCTypes('my_func.h','EnumClass','dynamic'); load_system(modelName)
Настройте параметры покрытия с помощью Simulink.SimulationInput объект.
covSet = Simulink.SimulationInput(modelName); covSet = covSet.setModelParameter('CovEnable','on'); covSet = covSet.setModelParameter('CovMetricStructuralLevel','MCDC'); covSet = covSet.setModelParameter('CovSFcnEnable','on'); covSet = covSet.setModelParameter('CovSaveSingleToWorkspaceVar','on'); covSet = covSet.setModelParameter('CovSaveName','covData'); covSet = covSet.setModelParameter('SimAnalyzeCustomCode','on');
Симулируйте модель с помощью covSet объект как вход.
simOut = sim(covSet); covData = simOut.covData;
Создайте объект селектора для фильтрации пользовательской функции C timesK.
sel = slcoverage.CodeSelector(slcoverage.CodeSelectorType.Function, 'my_func.c', 'timesK');
Создайте объект фильтра и создайте правило на основе селектора, затем добавьте правило к фильтру.
filt = slcoverage.Filter; rule = slcoverage.FilterRule(sel,'Tested elsewhere',... slcoverage.FilterMode.Exclude); addRule(filt,rule); setFilterName(filt,'Code Filter')
Сохраните фильтр следующим codefilter и добавить его в cvdata объект для my_func.c. Поскольку данные о покрытии хранятся в cv.cvdatagroup объект, используйте get метод для установки свойства.
save(filt,'codefilter'); covData.get('my_func.c').filter = 'codefilter';
Сгенерируйте отчет о покрытии.
cvhtml('codeCovReport',covData)
Просмотрите отчет. В разделе «Пользовательские файлы (Файлы) кода» нажмите my_func.c и найдите правило фильтра, добавленное в разделе Объекты, отфильтрованные из анализа покрытия.

В этом примере показано, как использовать slcoverage.CodeSelector объект для фильтрации результатов кода в пользовательской программе C или C++, вызываемой блоком C Caller.
Откройте модель и включите анализ покрытия
Откройте модель.
modelName = 'slcovCCallerExample'; Simulink.importExternalCTypes('my_func.h','EnumClass','dynamic'); load_system(modelName)
Настройте параметры покрытия с помощью Simulink.SimulationInput объект.
covSet = Simulink.SimulationInput(modelName); covSet = covSet.setModelParameter('CovEnable','on'); covSet = covSet.setModelParameter('CovMetricStructuralLevel','ConditionDecision'); covSet = covSet.setModelParameter('CovSFcnEnable','on'); covSet = covSet.setModelParameter('CovSaveSingleToWorkspaceVar','on'); covSet = covSet.setModelParameter('CovSaveName','covData');
Симулируйте модель с помощью covSet как вход.
simOut = sim(covSet); covData = simOut.covData;
Симуляция возвращает данные покрытия как cv.cvdatagroup объект, когда и модель, и пользовательский код анализируются на предмет покрытия. Чтобы извлечь данные покрытия кода, используйте get метод cvdatagroup класс.
codeCovData = get(covData,'my_func.c');
Обоснование отсутствующего результата
В этом примере вы объясняете F результат inputGElower условие в (u1->limits.upper_saturation_limit >= limit) && inputGElower решение, которое находится внутри counterbusFcn функция в my_func.c исходный файл.

Создайте объект селектора с помощью slcoverage.CodeSelector. Первый вход является CodeSelectorType перечисление. Чтобы обосновать результат условия, используйте ConditionOutcome перечисление. Второй вход является исходным файлом кода, my_func.c. Третий вход является именем функции, которая содержит результат, counterbusFcn. Четвертый вход является выражением, которое содержит результат, (u1->limits.upper_saturation_limit >= limit) && inputGElower. Пятый вход является индексом выражения, которому принадлежит результат. В этом случае inputGElower является вторым условием в родительском состоянии, поэтому этот вход 2. Шестой вход является индексом результата условия, который 1 для F результат логического выражения. Седьмой вход является индексом родительского решения или условия, которое 1 для (u1->limits.upper_saturation_limit >= limit) && inputGElower потому что это первое решение в функции.
enum = slcoverage.CodeSelectorType.ConditionOutcome; sel = slcoverage.CodeSelector(enum,'my_func.c','counterbusFcn','(u1->limits.upper_saturation_limit >= limit) && inputGElower',2,1,1);
Создайте Filter объект и FilterRule объект и применить правило к фильтру.
filt = slcoverage.Filter;
rule = slcoverage.FilterRule(sel,'condition does not apply');
addRule(filt,rule);
Сохраните фильтр в файл фильтра, а затем примените фильтр к cvdata объект.
save(filt,'codeOutcomeFilter'); codeCovData.filter = 'codeOutcomeFilter';
Просмотрите отчет о покрытии
Проверьте, что результат фильтруется путем создания отчета о покрытии с помощью cvhtml.
cvhtml('filteredCodeCovReport',codeCovData)

cv.cvdatagroup | cvdata | slcoverage.Filter | slcoverage.FilterRule | slcoverage.MetricSelector | slcoverage.SFcnSelector
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.