В следующем примере показано, как использовать Simulink® Диалоговое окно Code Inspector™ для выполнения ключевых задач в рабочем процессе верификации кода. В этом примере вы:
Подготовьте иерархию модели для генерации кода и инспекции кода.
Автоматически сгенерируйте код для иерархии модели.
Проверьте сгенерированный код независимо от инструмента генерации кода.
Намеренно внесите ошибку в сгенерированный код и проверьте на отказ.
Примечание
Пример Введение в Simulink Code Inspector демонстрирует тот же рабочий процесс верификации кода с использованием MATLAB® команды.
Откройте пример модели slcidemo_roll_orig
с помощью следующей команды:
>> slcidemo_roll_orig
Сохраните копию модели, переименовав ее в slcidemo_roll
, и смените текущую рабочую папку MATLAB на местоположение сохраненной модели. Верхний уровень модели появляется следующим образом.
Эта модель представляет собой основной автопилот оси крена с двумя рабочими режимами: удержание положения крена и удержание курса. Логика режима для этих режимов является внешней по отношению к этой модели. Архитектура модели представляет режим удержания заголовка и базовую функцию ориентации крена как модели-ссылки. Модель включает в себя:
Виртуальная подсистема RollAngleReference
, который реализует основной угол крена ссылки вычисления. Embedded Coder® генерация кода встраивает это вычисление непосредственно в главную функцию для slcidemo_roll
.
Блок Model HeadingMode
, ссылка на отдельную модель, которая вычисляет команду roll для отслеживания заголовка.
Блок Model BasicRollMode
, ссылка на отдельную модель, которая вычисляет функцию управления положением крена.
Подготовьте модель для генерации кода и инспекции кода.
Примечание
Если вы пробуете этот пример с моделью, отличной от slcidemo_roll
, установите параметр модели AdvancedOptControl
к значению '-SLCI'
. Эта настройка ограничивает оптимизацию кода, которую использует Embedded Coder, подмножеством, которое совместимо с инспекцией кода. Когда вы используете эту настройку, сгенерированный код может отличаться от кода, сгенерированного без '-SLCI'
настройка. Однако различия не влияют на поведение сгенерированного кода.
При выбранном окне верхней модели выполните следующую команду:
>> set_param(gcs, 'AdvancedOptControl', '-SLCI')
В верхнем окне модели на вкладке Apps выберите Code Inspector. Откроется диалоговое окно Simulink Code Inspector.
Сконфигурируйте проверки совместимости модели. В данном примере выберите Inspect all referenced models и нажмите Apply. Эта настройка включает модели-ссылки в проверке совместимости модели, а также инспекцию кода. Диалоговое окно должно появиться следующим образом:
Запустите проверку совместимости модели, нажав Check all models. На панели проверки совместимости отображается индикатор прогресса.
Результаты появляются в командном окне и в окне сводного отчета HTML.
В Командном Окне MATLAB отображаются результаты, аналогичные следующим:
В окне сводного отчета HTML отображаются результаты, аналогичные следующим.
Примечание
Этот отчет HTML также связан из результатов командного окна. Он сохранен как файл summaryReport.html
в подпапке /slprj/modeladvisor
в текущей рабочей папке.
Проверьте функциональность модели во время выполнения. В данном примере можно проверить функциональность во время выполнения путем симуляции модели. Прежде чем продолжить инспекцию кода, ваша модель должна моделироваться без ошибок.
Сгенерируйте код для модели. Можно неявно сгенерировать код как часть инспекции кода (используя опцию Generate code before code inspection диалогового окна Simulink Code Inspector), или выполнить генерацию кода и инспекцию кода как отдельные шаги. Этот пример отделяет шаг генерации кода от шага инспекции кода.
В верхнем окне модели на вкладке Modeling выберите Model Settings, чтобы открыть диалоговое окно Параметры конфигурации. На панели Code Generation > Report выберите Open report automatically опции. (Если вы пробуете этот пример с моделью, отличной от slcidemo_roll
, также выберите Code-to-model, Model-to-code, Eliminated / virtual blocks, Traceable Simulink blocks, Traceable Stateflow objects, и Traceable MATLAB functions в Report панель.) Щелкните Apply и сохраните изменения модели.
В окне модели нажмите Ctrl+B, чтобы сгенерировать код. Прогресс отображается в Командном Окне MATLAB.
Генерация кода Embedded Coder отображает результаты в окне HTML.
Смотрите сгенерированный код.
Откройте диалоговое окно Simulink Code Inspector, если оно еще не открыто, и исследуйте настройки параметра инспекции кода. Параметр Code placement установлен в Embedded Coder default
, который конфигурирует инспекцию кода, чтобы использовать структуру папки Embedded Coder по умолчанию, созданную генерацией кода.
При необходимости можно изменить местоположение, на которое инспекция кода запишет отчет проверки кода, используя Report folder параметра диалогового окна. Для примера введите путь ./report
и нажмите Apply.
Чтобы просмотреть сгенерированный код, нажмите Inspect Code. Simulink Code Inspector отображает индикатор прогресса.
Simulink Code Inspector отображает сводные данные в окне HTML отчета.
Сводный отчет связывается с подробными отчетами о инспекции кода для верхней модели и каждой модели-ссылки. Например, вот самая верхний фрагмент отчета о инспекции кода для верхней модели, slcidemo_roll
.
Сводный отчет и подробные отчеты о инспекции кода сохраняются как HTML файлов в указанном Report folder местоположении.
Вставьте ошибку в сгенерированный код и проверьте на отказ.
Чтобы показать неудачный результат, этот пример вставляет преднамеренную ошибку в сгенерированный код. Блок Логического Оператора внутри RollAngleReference
изменяется подсистема в сгенерированном коде от операции OR (||
) на операцию AND (&&
), используя пример служебной функции slcidemo_modifycode
.
Чтобы выделить блок, для которого изменяется соответствующий код, выполните следующую команду:
>> hilite_system('slcidemo_roll/RollAngleReference/Or');
Чтобы изменить ИЛИ на И, выполните следующие команды:
>> cfile = fullfile('.','slcidemo_roll_ert_rtw','slcidemo_roll.c'); >> slcidemo_modifycode(cfile,'<S1>/Or','||','&&')
The slcidemo_modifycode
Служебная функция отображает следующий выход:
Modified line 52 of file .\slcidemo_roll_ert_rtw\slcidemo_roll.c. Before: if ((rtU_Phi >= 6.0F) || (rtU_Phi <= -6.0F)) { After : if ((rtU_Phi >= 6.0F) && (rtU_Phi <= -6.0F)) {
Чтобы повторно отследить сгенерированный код, откройте диалоговое окно Simulink Code Inspector, если он еще не открыт, и нажмите Inspect code.
Просмотрите отчеты инспекции кода.
В сводном отчете отображается отказ для верхней части.
Отчет о инспекции кода для верхней части содержит несколько признаков неудачного сравнения между блоком Logical Operator и соответствующим кодом. В верхней части отчета показано следующее.
Далее в отчете, в разделе Code Verification Details > Model-to Code Verification, помечено несоответствие между блоком и кодом.
Кроме того, в разделе Traceability Details > Model-to Code Traceability помечено несоответствие между блоком и кодом.
Опционально попробуйте изменить модель или другие аспекты сгенерированного кода, чтобы увидеть, как влияют результаты инспекции кода.