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