exponenta event banner

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

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

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

  • Уменьшение выражений до констант

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

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

Эта оптимизация приводит к:

  • Снижение потребления ПЗУ и ОЗУ

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

Настройка модели

Чтобы сделать оптимизацию более вероятной:

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

    • Блоки ввода и вывода

    • Блочные выходы

    • Входы блоков, например, для блоков MATLAB Function и Stateflow Chart

    • Simulink.Signal объекты

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

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

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

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

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

Обзор

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

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

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

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

  • Уменьшение потребления ПЗУ и ОЗУ.

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

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

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

model = 'rtwdemo_minmax';
open_system(model);

Создать код без этой оптимизации

Сначала создайте код для этой модели без учета значений min и max.

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

Build Summary

Top model targets built:

Model           Action                       Rebuild Reason                                    
===============================================================================================
rtwdemo_minmax  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 10.121s

Часть 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. Откройте диалоговое окно «Параметры конфигурации».

  2. На панели Оптимизация (Optimization) выберите Оптимизировать (Optimize), используя указанные минимальное и максимальное значения.

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

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

Создание кода с помощью этой оптимизации

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

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

Настройте и создайте модель с помощью встроенного кодера.

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

Build Summary

Top model targets built:

Model           Action                       Rebuild Reason                   
==============================================================================
rtwdemo_minmax  Code generated and compiled  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 9.2066s

Просмотр оптимизированного кода из 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 на выходе блока «Слияние» и укажите диапазон для этого объекта.

    • Элементы шины.

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

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

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

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

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

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

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

  • При выборе этой опции в окне «Проверка параметров оптимизации, связанных с безопасностью» (Simulink Check) появится предупреждение. Для многих критически важных для безопасности приложений автоматическое удаление мертвого кода неприемлемо, поскольку это может сделать код не отслеживаемым.

См. также

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