После тестирования вашей модели 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.