Пакет: slcoverage
Выберите пользовательский код C or C++ для фильтра покрытия
Используйте объекты slcoverage.CodeSelector
класс, чтобы задать пользовательские критерии выбора кода C or C++ для правила фильтра.
slcoverage.CodeSelector
классом является handle
класс.
sel = slcoverage.CodeSelector(type,fileName)
создает CodeSelector
объект заданного type
на основе заданного fileName
и устанавливает Type
и FileName
свойства.
sel = slcoverage.CodeSelector(type,fileName,functionName)
создает CodeSelector
основанный на объектах на заданном C или C++ functionName
в файле и наборах 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 or C++.
slcoverage.CodeSelectorType.Condition
— Пользовательское условие кода C or C++.
slcoverage.CodeSelectorType.DecisionOutcome
— Пользовательский результат решения кода C or C++.
slcoverage.CodeSelectorType.ConditionOutcome
— Пользовательский результат условия кода C or C++.
slcoverage.CodeSelectorType.MCDCOutcome
— Пользовательский код C or C++ результат MCDC.
slcoverage.CodeSelectorType.RelationalBoundaryOutcome
— Пользовательский код C or 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
результат.
Для переключателя/оператора выбора введите 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.