Оптимизируйте сгенерированный код Используя минимальные и максимальные значения

Чтобы оптимизировать сгенерированный код для вашей модели, можно выбрать опцию, чтобы использовать информацию о входном диапазоне, также известную как design minimum and maximum, который вы задаете на сигналах и параметрах. Эти минимальные и максимальные значения обычно представляют экологические пределы, такие как температура, или механическое устройство и электрические пределы, такие как выходные области значений датчиков.

В диалоговом окне Configuration Parameters, когда вы устанавливаете флажок Optimize using specified minimum and maximum values, программное обеспечение использует минимальные и максимальные значения, чтобы вывести информацию об области значений для нисходящих сигналов в модели. Это затем использует эту выведенную информацию об области значений, чтобы определить, возможно ли оптимизировать сгенерированный код:

  • Сокращение выражений к константам

  • Удаление мертвых ответвлений условных операторов

  • Устранение ненужных математических операций

Это результаты оптимизации в:

  • Уменьшаемый ROM и потребление RAM

  • Улучшенная скорость выполнения

Сконфигурируйте свою модель

Сделать оптимизацию более вероятно:

  • Обеспечьте как можно больше минимума проекта и максимальной информации. Задайте минимальные и максимальные значения для сигналов и параметров в модели для:

    • Inport и блоки Outport

    • Блокируйте выходные параметры

    • Блокируйте входные параметры, например, для блоков функции MATLAB и диаграммы Stateflow

    • Объекты Simulink.Signal

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

     Включите проверку диапазона симуляции

  • Обеспечьте минимум проекта и максимальную информацию в восходящем направлении блоков максимально близко к входным параметрам блоков. Если вы зададите минимальные и максимальные значения для блока вывод, эти значения, скорее всего, будут влиять на выходные параметры блоков сразу в нисходящем направлении.

Оптимизируйте сгенерированный код Используя заданные минимальные и максимальные значения

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

Обзор

Заданные минимальные и максимальные значения обычно представляют экологические пределы, такие как температура, или механическое устройство и электрические пределы, такие как выходные области значений датчиков.

Эта оптимизация использует эти значения, чтобы оптимизировать сгенерированный код. Например, это уменьшает выражения до констант или удаляет мертвые ответвления условных операторов.

ПРИМЕЧАНИЕ: Убедитесь минимальные и максимальные значения, которые вы задаете, допустимые пределы. В противном случае эта оптимизация может привести к числовому несоответствию с симуляцией.

Преимущества оптимизации сгенерированного кода:

  • Сокращение ROM и потребления RAM.

  • Улучшение скорости выполнения.

Рассмотрите минимальную и максимальную информацию

Рассмотрите модель rtwdemo_minmax. В этой модели существуют минимальные и максимальные значения, заданные на Inports и на параметре усиления блока Gain.

model = 'rtwdemo_minmax';
open_system(model);

Сгенерируйте код без этой оптимизации

Во-первых, сгенерируйте код для этой модели, не рассматривая min и макс. значения.

currentDir = pwd;
[~,cgDir] = rtwdemodir();
rtwconfiguredemo(model,'ERT')
rtwbuild(model)
### Starting build procedure for model: rtwdemo_minmax
### Successful completion of build procedure for model: rtwdemo_minmax

Фрагмент rtwdemo_minmax.c описан ниже.

cfile = fullfile(cgDir,'rtwdemo_minmax_ert_rtw','rtwdemo_minmax.c');
rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_minmax_step(void)
{
  int32_T tmp;

  /* Sum: '<Root>/Sum' incorporates:
   *  Inport: '<Root>/U1'
   *  Inport: '<Root>/U2'
   *  Sum: '<Root>/Sum2'
   *  Switch: '<Root>/Switch'
   */
  tmp = U1 + U2;

  /* Switch: '<Root>/Switch' incorporates:
   *  Gain: '<Root>/Gain'
   *  Inport: '<Root>/U3'
   *  RelationalOperator: '<Root>/Relational Operator'
   *  Sum: '<Root>/Sum'
   */
  if (tmp <= k * U3) {
    /* Outport: '<Root>/Out1' incorporates:
     *  Sum: '<Root>/Sum2'
     */
    rtY.Out1 = tmp + U3;
  } else {
    /* Outport: '<Root>/Out1' incorporates:
     *  Inport: '<Root>/U1'
     *  Inport: '<Root>/U2'
     *  Product: '<Root>/Product'
     */
    rtY.Out1 = U1 * U2 * U3;
  }
}

Включите эту оптимизацию

  1. Откройте диалоговое окно Configuration Parameters.

  2. На панели Оптимизации выберите Optimize с помощью заданных минимальных и максимальных значений.

Также можно включить эту оптимизацию путем установки параметра командной строки.

set_param(model, 'UseSpecifiedMinMax', 'on');

Сгенерируйте код с этой оптимизацией

В модели, с заданными минимальными и максимальными значениями для U1 и U2, сумма U1 и U2 имеет минимальное значение 50. Рассматривая область значений U3 и заданных минимальных и максимальных значений для параметров блоков Усиления, максимальное значение блока Gain вывод равняется 40.

Вывод блока Relational Operator остается ложным, и вывод блока switch остается продукт трех входных параметров.

Сконфигурируйте и создайте модель с помощью Embedded Coder.

rtwconfiguredemo(model,'ERT')
rtwbuild(model)
### Starting build procedure for model: rtwdemo_minmax
### Successful completion of build procedure for model: rtwdemo_minmax

Просмотрите оптимизированный код от rtwdemo_minmax.c.

cfile = fullfile(cgDir,'rtwdemo_minmax_ert_rtw','rtwdemo_minmax.c');
rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_minmax_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Inport: '<Root>/U1'
   *  Inport: '<Root>/U2'
   *  Inport: '<Root>/U3'
   *  Product: '<Root>/Product'
   *  Switch: '<Root>/Switch'
   */
  rtY.Out1 = U1 * U2 * U3;
}

Закройте модель и очистку.

bdclose(model)
rtwdemoclean;
cd(currentDir)

Ограничения

  • Эта оптимизация не учитывает минимальные и максимальные значения для:

    • Объедините входные параметры блока. Чтобы работать вокруг этой проблемы, используйте объект Simulink.Signal на блоке Merge вывод и задайте область значений на этом объекте.

    • Соедините шиной элементы.

    • Условно выполняемая подсистема (такая как инициированная подсистема) блокирует выходные параметры, которые непосредственно соединяются с блоком Outport.

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

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

    Polyspace Code Prover™ автоматически получает некоторые минимальные и максимальные значения, заданные в рабочей области MATLAB®, например, для объектов Simulink.Parameter и Simulink.Signal. В этом примере, чтобы предоставить информацию об области значений программному обеспечению Polyspace, используют объект Simulink.Signal на входе деления и задают область значений, которая не включает нуль.

    Polyspace Code Prover хранит эти значения в файле Спецификации области значений данных (DRS). Однако они не получают все минимальные и максимальные значения в вашей модели Simulink®. Чтобы предоставить дополнительную минимальную и максимальную информацию Polyspace, можно вручную задать файл DRS.

  • Если вы используете типы данных с двойной точностью, и параметр конфигурации Support non-finite numbers выбран, эта оптимизация не происходит.

  • Если ваша модель содержит несколько экземпляров допускающей повторное использование подсистемы, и каждый экземпляр использует входные сигналы с различными минимальными и максимальными значениями, эта оптимизация может привести к различному сгенерированному коду для каждой подсистемы, таким образом, повторное использование кода не происходит. Без этой оптимизации код сгенерирован однажды для подсистемы и совместно использует этот код среди нескольких экземпляров подсистемы.

  • Связанные с безопасностью настройки оптимизации Проверки проверки Model Advisor генерируют предупреждение, если эта опция выбрана. Для многих важных приложений безопасности, удаляя мертвый код автоматически недопустимо, потому что выполнение так может сделать код непрослеживаемым.

Смотрите также

Похожие темы