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

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

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

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

  2. Для G2, откройте диалоговое окно Gain Параметры Блоков. Введите значение 2.

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

  4. Для блока Switch откройте диалоговое окно Параметров блоков. Для параметра Criteria for passing first input выберите u2>=Threshold.

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

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

  2. Очистите параметр Configuration Parameters > Signal storage reuse.

  3. Выберите панель Code Generation > Report и Create code generation report.

  4. Выберите панель Code Generation. Выберите Generate code only, а затем в окне модели нажмите Ctrl+B. Когда генерация кода завершена, появляется отчет генерации кода HTML.

  5. В отчете генерации кода выберите local_variable_ex.c сечение и просмотр функции шага модели. Выходные выходы блока Gain являются глобальными переменными 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. Этот Signal Storage Reuse включает следующие параметры оптимизации:

    • Enable local block outputs

    • Reuse local block outputs

    • Eliminate superfluous local variables (expression folding)

  2. Очистить Reuse local block outputs и Eliminate superfluous local variables (expression folding).

  3. Сгенерируйте код и просмотрите функцию шага модели. В функции шага модели три локальные переменные, потому что вы выбрали Enable Local Block Outputs параметра оптимизации. Локальные переменные rtb_G2 и rtb_G1 удерживать выходы блоков Gain. Локальная переменная 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. Выберите параметр Configuration Parameters > Reuse local block outputs.

  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 и связанная копия данных не находится в сгенерированном коде.

См. также

Похожие темы