Зафиксируйте проблемы при создании моделей, найденные как ошибки в сгенерированном коде

После тестирования вашей модели Simulink® для соответствия стандартов и ошибок проектирования, можно сгенерировать код из модели. Перед развертыванием можно выполнить последний слой проверки ошибок на сгенерированном коде при помощи Polyspace®. Проверки обнаруживают проблемы, такие как мертвая логика или неправильные опции генерации кода, которые могут остаться несмотря на тесты на модели.

Следующее является примерами проблем, которые обнаруживаются в сгенерированном коде, но могут быть зафиксированы в исходной модели.

Предпосылки

Прежде чем вы запустите Polyspace от Simulink, необходимо соединить Polyspace и установки MATLAB®. Смотрите Интегрируют Polyspace с MATLAB и Simulink.

Открытая модель с диаграммой Stateflow, содержащей проблемы проекта

Модель CruiseControl_RP содержит диаграмму Stateflow с проблемами проекта. Проблемы переводят в возможные ошибки времени выполнения или недостижимые ответвления в сгенерированном коде.

Сгенерируйте и анализируйте код

Сгенерируйте код С из модели и проверяйте сгенерированный код на ошибки времени выполнения при помощи Polyspace Code Prover™.

Сгенерируйте код

Чтобы начаться, выберите Code> C/C++ Code> Build Model. Следуйте за успехом генерации кода в Средстве просмотра Диагностики Simulink.

Для получения дополнительной информации смотрите, Генерируют код С из Моделей Simulink (Embedded Coder).

Сконфигурируйте анализ кода

Анализ по умолчанию осуществляет проверки Программы автоматического доказательства Кода только. Включите проверку MISRA C®:2012.

Выберите Code> Polyspace> Options. В выпадающем Settings from выберите Project configuration and MISRA C 2012 checking.

Контрольный код для ошибок

Выберите Code> Polyspace> Verify Code Generated for> Model. Следуйте за прогрессом анализа кода в Окне Команды 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

  • Измените аналитическую настройку:

    Выберите Code> Polyspace> Options. Измените опцию Настраиваемые параметры, чтобы использовать калибровочные данные. Анализ Программы автоматического доказательства Кода использует значение 5 для holdrate вместо области значений [0.. 10].

Если вы регенерируете и повторно анализируете код, вы больше не видите оранжевые проверки Division by zero. Вы также не видите другие оранжевые проверки, потому что у них есть та же первопричина. Панель Dashboard показывает, что все проверки являются зелеными.

Зафиксируйте нарушения MISRA C:2012

Выберите нарушение правила 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.

Похожие темы