Пакет: 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.