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

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

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

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

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

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

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

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

Модель не содержит зависимости по данным через итерации цикла for. Поэтому генератор кода комбинирует циклы for в один цикл. Создайте модель и просмотрите сгенерированный код.

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

Сгенерированный файл, 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 += (1.0 + (real_T)k) +
      rtwdemo_forloop_DW.Delay_DSTATE[k];
  }
}

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

Похожие темы