exponenta event banner

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

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

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

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

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

for Образцы моделирования контуров

В модели, rtwdemo_forloop, блок переключения и блок функции MATLAB представляют for конструкции. В In1 «Параметры блока», для параметра «Размеры порта» установлено значение 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];
  }
}

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

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