exponenta event banner

Исправление проблем конструкции модели, обнаруженных как ошибки в сгенерированном коде

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

Ниже приведены примеры проблем, которые обнаружены в сгенерированном коде, но могут быть исправлены в исходной модели.

Предпосылки

Перед запуском Polyspace из Simulink необходимо связать установки Polyspace и MATLAB ®. См. раздел Интеграция полиспейса с MATLAB и Simulink.

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

openExample('polyspace_code_prover/FixIssuesInGeneratedCodeFoundWithPolyspaceCodeProverExample')

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

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

Создание и анализ кода

Создайте код C из модели и проверьте созданный код на наличие ошибок времени выполнения с помощью Prover™ кода Polyspace.

Создать код

Чтобы создать код, на вкладке Приложения выберите Встроенный кодер. Затем на вкладке C Code выберите Generate Code. Следите за ходом создания кода в Simulink Diagnostic Viewer.

Дополнительные сведения см. в разделе Создание кода C на основе моделей Simulink (Embedded Coder).

Настройка анализа кода

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

На вкладке Полиспейс (Polyspace) выберите Настройки (Settings), чтобы открыть окно Параметры конфигурации Simulink (Simulink Configuration Parameters). В раскрывающемся списке «Параметры» выберите Project configuration and MISRA C 2012 checking.

Проверка кода на наличие ошибок

На вкладке «Полиспейс» щелкните в любом месте полотна. В поле Analyze Code from отображается имя модели. Выберите Выполнить анализ (Run Analysis). Следите за ходом анализа кода в окне команд MATLAB.

Дополнительные сведения см. в разделе Выполнение анализа полиспейса для кода, созданного с помощью встроенного кодера.

Устранение проблем

Результаты проверки кода открываются в интерфейсе пользователя Polyspace. Результаты содержат некоторые серые проверки (недоступный код) и оранжевые проверки (потенциальные ошибки времени выполнения).

Исправить серые проверки

Выберите одну из двух проверок недостижимого кода. Просмотрите недоступный код.

            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 больше не отображаются.

Исправить оранжевые проверки

Выберите одну из двух проверок Division by zero. Просмотрите код.

if (CruiseControl_RP_DW.temporalCounter_i1 >= (uint32_T)(incdec /
               holdrate * 10.0F))
Установите курсор на переменную holdrate. Вы видите, что это глобальная переменная, значение которой может быть равно нулю.

Дело в том, что holdrate является глобальной переменной, которая может быть определена вне модели. Откройте окно Обозреватель моделей (Model Explorer). В иерархии модели выберите базовую рабочую область. Найти holdrate в списке параметров. Вы видите, что holdrate имеет значение 5, но может находиться в диапазоне от 0 до 10. В анализе проверки кода используется этот диапазон и определяется деление на ноль.

Можно изменить либо созданный код, либо конфигурацию анализа:

  • Изменить код:

    В окне проводника моделей измените класс хранения holdrate от Global кому Define. Созданный код определяет typedef, который гарантирует, что holdrate имеет значение 5.

    #define holdrate 5

  • Изменение конфигурации анализа:

    На вкладке «Полиспейс» выберите «Параметры». Измените опцию Tunable parameters, чтобы использовать данные калибровки. В анализе проверки кода используется значение 5 для holdrate вместо диапазона [0.. 10].

При регенерации и повторном анализе кода оранжевый сектор больше не отображается при нулевых проверках. Вы также не видите другие оранжевые чеки, потому что они имеют ту же основную причину. Панель «Панель мониторинга» показывает, что все проверки зеленые.

Устранение нарушений 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.

Связанные темы