exponenta event banner

Включение и повторное использование выходных данных локального блока в сгенерированном коде

В этом примере показано, как задать вывод блока в качестве локальных переменных. Генератор кода может потенциально повторно использовать эти локальные переменные в сгенерированном коде. Объявление блочного выхода локальными переменными сохраняет потребление ПЗУ. Повторное использование локальных переменных экономит ОЗУ, уменьшает количество копий данных и увеличивает скорость выполнения.

Пример модели

  1. Блоки Inport, Outport, Gain и Switch используются для создания следующей модели. В этом примере модель называется local_variable_ex.

  2. Для G2откройте диалоговое окно «Параметры блока усиления». Введите значение, равное 2.

  3. Для G1, введите значение 3.

  4. Для блока переключения откройте диалоговое окно «Параметры блока». В поле «Критерии передачи первого входного параметра» выберите u2>=Threshold.

Создание кода без оптимизации

  1. Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters). Выберите панель Решатель (Solver). Для параметра «Тип» выберите Fixed-step.

  2. Снимите флажок Configuration Parameters > Signal storage reuse (Параметры конфигурации > Повторное использование хранилища сигналов).

  3. Выберите панель Создание кода > Отчет и выберите Создать отчет о создании кода.

  4. Выберите панель «Создание кода». Выберите Только генерировать код (Generate code only), а затем в окне модели нажмите клавиши Ctrl + B. По завершении создания кода появляется отчет о создании кода HTML.

  5. В отчете о создании кода выберите local_variable_ex.c и просмотрите функцию шага модели. Выходные сигналы блока усиления являются глобальными переменными local_variable_ex_B.G2 и local_variable_ex_B.G1.

/* Model step function */
void local_variable_ex_step(void)
{
  /* Switch: '<Root>/Switch' incorporates:
   *  Inport: '<Root>/In1'
   */
  if (local_variable_ex_U.In1 >= 0.0) {
    /* Gain: '<Root>/G2' */
    local_variable_ex_B.G2 = 2.0 * local_variable_ex_U.In1;

    /* Outport: '<Root>/Out1' */
    local_variable_ex_Y.Out1 = local_variable_ex_B.G2;
  } else {
    /* Gain: '<Root>/G1' */
    local_variable_ex_B.G1 = 3.0 * local_variable_ex_U.In1;

    /* Outport: '<Root>/Out1' */
    local_variable_ex_Y.Out1 = local_variable_ex_B.G1;
  }

  /* End of Switch: '<Root>/Switch' */

Включить локальные блочные выходы и создать код

  1. Выберите параметр Configuration Parameters > Signal Storage Reuse. Повторное использование системы хранения сигналов позволяет использовать следующие параметры оптимизации:

    • Включить локальные блочные выходы

    • Повторное использование выходных данных локальных блоков

    • Исключение лишних локальных переменных (сворачивание выражений)

  2. Снимите флажки «Повторно использовать выходные данные локальных блоков» и «Исключить лишние локальные переменные» (сворачивание выражений).

  3. Создайте код и просмотрите функцию шага модели. В функции шага модели есть три локальные переменные, поскольку выбран параметр оптимизации «Включить выходные данные локального блока». Локальные переменные rtb_G2 и rtb_G1 удерживать выходы блоков усиления. Локальная переменная rtb_Switch содержит выходные данные блока Switch.

/* Model step function */
void local_variable_ex_step(void)
{
  real_T rtb_Switch;
  real_T rtb_G2;
  real_T rtb_G1;

  /* Switch: '<Root>/Switch' incorporates:
   *  Inport: '<Root>/In1'
   */
  if (local_variable_ex_U.In1 >= 0.0) {
    /* Gain: '<Root>/G2' */
    rtb_G2 = 2.0 * local_variable_ex_U.In1;
    rtb_Switch = rtb_G2;
  } else {
    /* Gain: '<Root>/G1' */
    rtb_G1 = 3.0 * local_variable_ex_U.In1;
    rtb_Switch = rtb_G1;
  }

  /* End of Switch: '<Root>/Switch' */

  /* Outport: '<Root>/Out1' */
  local_variable_ex_Y.Out1 = rtb_Switch;

Повторное использование выходных данных локального блока и создание кода

  1. Выберите параметр «Параметры конфигурации» > «Повторно использовать выходные данные локального блока».

  2. Создать код. В local_variable_ex.c просмотрите функцию шага модели. Существует одна локальная переменная, rtb_G2что генератор кода использует три раза.

/* Model step function */
void local_variable_ex_step(void)
{
  real_T rtb_G2;

  /* Switch: '<Root>/Switch' incorporates:
   *  Inport: '<Root>/In1'
   */
  if (local_variable_ex_U.In1 >= 0.0) {
    /* Gain: '<Root>/G2' */
    rtb_G2 = 2.0 * local_variable_ex_U.In1;
  } else {
    /* Gain: '<Root>/G1' */
    rtb_G2 = 3.0 * local_variable_ex_U.In1;
  }

  /* End of Switch: '<Root>/Switch' */

  /* Outport: '<Root>/Out1' */
  local_variable_ex_Y.Out1 = rtb_G2;

Дополнительная временная переменная rtb_Switch и соответствующая копия данных отсутствует в сгенерированном коде.

См. также

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