После тестирования вашей модели Simulink® для податливости стандартов и ошибок проектирования, можно сгенерировать код из модели. Перед развертыванием можно выполнить последний слой проверки ошибок на сгенерированном коде при помощи Polyspace®. Проверки обнаруживают проблемы, такие как мертвая логика или неправильные опции генерации кода, которые могут остаться несмотря на тесты на модели.
Следующее является примерами проблем, которые обнаруживаются в сгенерированном коде, но могут быть зафиксированы в исходной модели.
![]()
Прежде чем вы запустите Polyspace от Simulink, необходимо соединить Polyspace и установки MATLAB®. Смотрите Интегрируют Polyspace с MATLAB и Simulink.
Чтобы открыть модель, используемую в этом примере, ищите этот пример в Браузере документации MATLAB и нажмите кнопку Open Model.
![]()
Модель CruiseControl_RP содержит диаграмму Stateflow с проблемами проекта. Проблемы переводят в возможные ошибки времени выполнения или недостижимые ветви в сгенерированном коде.

Сгенерируйте код С из модели и проверяйте сгенерированный код на ошибки времени выполнения при помощи Polyspace Code Prover™.
Чтобы сгенерировать код, на вкладке Apps, выбирают Embedded Coder. Затем на вкладке C Code выберите Generate Code. Следуйте за прогрессом генерации кода в Средстве просмотра Диагностики Simulink.
Для получения дополнительной информации смотрите, Генерируют код С из Моделей Simulink (Embedded Coder).
![]()
Анализ Программы автоматического доказательства Кода по умолчанию запускает проверки на этапе выполнения Программы автоматического доказательства Кода только. Включите проверку MISRA C®:2012 в дополнение к проверкам по умолчанию.
На вкладке Polyspace выберите Settings, чтобы открыть окно Simulink Configuration Parameters. В выпадающем списке Settings from выберите Project configuration and MISRA C 2012 checking.
![]()
На вкладке Polyspace щелкните где угодно на холсте. Поле Analyze Code from показывает имя модели. Выберите Run Analysis. Следуйте за прогрессом анализа кода в командном окне MATLAB.
Для получения дополнительной информации смотрите Анализ Polyspace Запуска Кода, Сгенерированного с Embedded Coder.
![]()
Программа автоматического доказательства Кода приводит открытая к пользовательскому интерфейсу Polyspace. Результаты содержат некоторые серые проверки (недостижимый код) и оранжевые проверки (потенциальные ошибки времени выполнения).
Выберите одну из двух проверок Unreachable code. Рассмотрите код, который недостижим.
if ((CoastSetSw_prev != CruiseControl_RP_DW.CoastSetSw_start) &&
CruiseControl_RP_DW.CoastSetSw_start &&
(CruiseControl_RP_Y.tspeed > (real_T)mintspeed)) {
/* Transition: '<S1>:74' */
CruiseControl_RP_DW.is_ON = CruiseControl_RP_IN_Coast;
CruiseControl_RP_DW.temporalCounter_i1 = 0U;
/* Entry 'Coast': '<S1>:73' */
CruiseControl_RP_Y.tspeed -= (real_T)incdec;
}Нажмите Transition:'<S1>:74' соединитесь в if блок. Переход подсвечен в модели.
![]()

![]()
Отметьте недостаток дизайна. Условие для исходящего перехода 3 не может быть верным без условия для исходящего перехода 2 также быть верным. Поэтому переход 3, который выполняется позже, никогда не достигается. Этот недостаток дизайна в графике переводит в недостижимый if блокируйтесь в сгенерированном коде.
Можно устранить проблему в различных способах. Одна возможность состоит в том, чтобы переключить порядок выполнения переходов 2 и 3. Чтобы начаться, щелкните правой кнопкой по переходу 3.
Если вы регенерируете и повторно анализируете код, вы больше не видите серые проверки Unreachable code.
![]()
Выберите одну из двух проверок Division by zero. Рассмотрите код.
if (CruiseControl_RP_DW.temporalCounter_i1 >= (uint32_T)(incdec /
holdrate * 10.0F))holdrate. Вы видите, что это - глобальная переменная, значение которой может быть нулем.Факт, что holdrate подсказки глобальной переменной, что это могло быть задано вне модели. Откройте окно Model Explorer. В иерархии модели выберите базовое рабочее пространство. Найдите holdrate в списке параметров. Вы видите тот holdrate имеет значение 5, но может лежать в диапазоне от 0 до 10. Анализ Программы автоматического доказательства Кода использует эту область значений и обнаруживает деление на нуль.
Можно изменить или сгенерированный код или аналитическую настройку:
Измените код:
В окне Model Explorer измените класс памяти holdrate от Global к Define. Сгенерированный код задает определение типа, которое гарантирует тот holdrate имеет значение 5.
#define holdrate 5
Измените аналитическую настройку:
На вкладке Polyspace выберите Settings. Измените опцию Настраиваемые параметры, чтобы использовать калибровочные данные. Анализ Программы автоматического доказательства Кода использует значение 5 для holdrate вместо области значений [0.. 10].
Если вы регенерируете и повторно анализируете код, вы больше не видите оранжевые проверки Division by zero. Вы также не видите другие оранжевые проверки, потому что у них есть та же первопричина. Панель Dashboard показывает, что все проверки являются зелеными.
![]()

![]()
Выберите нарушение правила 3.1:
The character sequences /* and // shall not be used within a comment.
typedef struct {
uint8_T CC_Mode; /* '<Root>/CC_Mode' */
boolean_T RES; /* '<Root>/RES//+' */
boolean_T SET; /* '<Root>/SET//-' */
real_T SpeedSet; /* '<Root>/Speed_Set' */
real_T SpeedAct; /* '<Root>/Speed_Act' */
boolean_T Break; /* '<Root>/Break' */
} ExtU_CruiseControl_RP_T;// в комментариях к коду в определении структуры.Чтобы перейти к соответствующему местоположению в модели, нажмите '<Root>/RES//+' в комментарии к коду. Вы видите, что комментарий поступает от входной переменной RES/+ который содержит / символ.
![]()

![]()
Переименуйте переменную и также переменную SET/- так, чтобы они не использовали / символ. Когда ваш повторно анализировать код, вы больше не видите нарушения правила 3.1.