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

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

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

Необходимые условия

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

Открыть модель, используемую в этом примере, в командном окне MATLAB, запуске:

openExample('polyspace_code_prover/FixIssuesInGeneratedCodeFoundWithPolyspaceCodeProverExample')

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

Модель 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 показывает, что все проверки являются зелеными.

Зафиксируйте нарушения 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.

Похожие темы