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

В этом примере показано, как генератор кода объединяет for циклы. Сгенерированный код использует for конструкции, чтобы представлять множество шаблонов моделирования, таких как матричный сигнал или блоки Итератора. Используя анализ зависимостей данных, генератор кода комбинирует for Конструкции для уменьшения размера статического кода и ответвления во время выполнения.

Преимущества оптимизации for циклы:

  • Сокращение потребления ПЗУ и ОЗУ.

  • Увеличение скорости выполнения.

for Шаблоны моделирования цикла

В модели, rtwdemo_forloop, блок Switch и блок MATLAB Function представляют for конструкции. В In1 Параметры блоков, параметр Port dimensions установлен в 10 .

Сгенерируйте код

Модель не содержит зависимостей данных по for итерации цикла. Поэтому генератор кода объединяет for циклы в один цикл. Откройте приложение Simulink Coder или Embedded Coder. Затем сгенерируйте и просмотрите код.

### Starting build procedure for: rtwdemo_forloop
### Successful completion of build procedure for: rtwdemo_forloop

Build Summary

Top model targets built:

Model            Action                       Rebuild Reason                                    
================================================================================================
rtwdemo_forloop  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 25.561s

Сгенерированный файл, rtwdemo_forloop.c, содержит код для одиночного for цикл.

/* Model step function */
void rtwdemo_forloop_step(void)
{
  int32_T k;

  /* MATLAB Function: '<Root>/Accum' */
  /* MATLAB Function 'Accum': '<S1>:1' */
  /* '<S1>:1:3' */
  /* '<S1>:1:4' */
  rtwdemo_forloop_Y.Out1 = 0.0;

  /* '<S1>:1:5' */
  for (k = 0; k < 10; k++) {
    /* Switch: '<Root>/Switch' incorporates:
     *  Gain: '<Root>/G1'
     *  Gain: '<Root>/G3'
     *  Inport: '<Root>/In1'
     *  Sum: '<Root>/Sum1'
     *  Sum: '<Root>/Sum2'
     *  UnitDelay: '<Root>/Delay'
     */
    if (3.0 * rtwdemo_forloop_U.In1[k] >= 0.0) {
      rtwdemo_forloop_DW.Delay_DSTATE[k] = rtwdemo_forloop_U.In1[k] -
        rtwdemo_forloop_DW.Delay_DSTATE[k];
    } else {
      rtwdemo_forloop_DW.Delay_DSTATE[k] = (rtwdemo_forloop_DW.Delay_DSTATE[k] -
        rtwdemo_forloop_U.In1[k]) * 5.0;
    }

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

    /* MATLAB Function: '<Root>/Accum' */
    /* '<S1>:1:5' */
    /* '<S1>:1:6' */
    rtwdemo_forloop_Y.Out1 += ((real_T)k + 1.0) +
      rtwdemo_forloop_DW.Delay_DSTATE[k];
  }
}

Закройте модель.

Похожие темы