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]; } }
Закройте модель.