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

В этом примере показано, как задать, блокируют выход как локальные переменные. Генератор кода может потенциально снова использовать эти локальные переменные в сгенерированном коде. Блок Declaring выход как локальные переменные сохраняет потребление ROM. Многократное использование локальных переменных сохраняет потребление RAM, уменьшает копии данных и увеличивает скорость выполнения.

Модель в качестве примера

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

  2. Для G2, откройте диалоговое окно Gain Block Parameters. Введите значение 2.

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

  4. Для блока Switch откройте диалоговое окно Block Parameters. Для параметра 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 и связанная копия данных не находится в сгенерированном коде.

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

Похожие темы