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

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

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

  • Сокращение ROM и потребления RAM.

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

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

В модели rtwdemo_forloop, блок switch и блок MATLAB function представляют for построения. В In1 Диалоговое окно Block Parameters, параметр размерностей Порта устанавливается на 10 .

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

Модель не содержит зависимости по данным через for итерации цикла. Поэтому генератор кода комбинирует for циклы в один цикл. Откройте приложение Embedded Coder или Simulink 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];
  }
}

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

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте