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

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

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

  1. Используйте Inport, Выходной порт, Усиление и блоки 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 содержат выходные параметры блоков Усиления. Локальная переменная 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 и связанная копия данных не находится в сгенерированном коде.

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

Похожие темы