Optimize Generated Code by Combining Multiple for Constructs
This example shows how the code generator combines for loops. The generated code uses for constructs to represent a variety of modeling patterns, such as a matrix signal or Iterator blocks. Using data dependency analysis, the code generator combines for constructs to reduce static code size and runtime branching.
The benefits of optimizing for loops are:
Reducing ROM and RAM consumption.
Increasing execution speed.
for Loop Modeling Patterns
Open the example model ForLoopConstruct. The Switch block and MATLAB Function block represent for constructs. In the In1 Block Parameters dialog box, the Port dimensions parameter is set to 10.
model = 'ForLoopConstruct';
open_system(model);

Generate Code
The model does not contain data dependencies across the for loop iterations. Therefore, the code generator combines for loops into one loop.
Build the model.
slbuild(model)
### Searching for referenced models in model 'ForLoopConstruct'. ### Total of 1 models to build. ### Starting build procedure for: ForLoopConstruct ### Successful completion of build procedure for: ForLoopConstruct Build Summary Top model targets: Model Build Reason Status Build Duration =================================================================================================================== ForLoopConstruct Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 14.092s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 14.61s
View the optimized code in ForLoopConstruct.c.
cfile = fullfile('ForLoopConstruct_grt_rtw','ForLoopConstruct.c'); coder.example.extractLines(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void ForLoopConstruct_step(void)
{
real_T In1;
real_T rtb_y;
int32_T k;
/* MATLAB Function: '<Root>/Accum' */
/* MATLAB Function 'Accum': '<S1>:1' */
/* '<S1>:1:3' */
/* '<S1>:1:4' */
rtb_y = 0.0;
/* '<S1>:1:5' */
for (k = 0; k < 10; k++) {
/* Gain: '<Root>/G1' incorporates:
* Inport: '<Root>/In1'
*/
In1 = ForLoopConstruct_U.In1[k];
/* Switch: '<Root>/Switch' incorporates:
* Gain: '<Root>/G1'
* Gain: '<Root>/G3'
* Sum: '<Root>/Sum1'
* Sum: '<Root>/Sum2'
* UnitDelay: '<Root>/Delay'
*/
if (3.0 * In1 >= 0.0) {
In1 -= ForLoopConstruct_DW.Delay_DSTATE[k];
} else {
In1 = (ForLoopConstruct_DW.Delay_DSTATE[k] - In1) * 5.0;
}
/* End of Switch: '<Root>/Switch' */
/* MATLAB Function: '<Root>/Accum' */
/* '<S1>:1:6' */
rtb_y += ((real_T)k + 1.0) + In1;
/* Update for UnitDelay: '<Root>/Delay' */
ForLoopConstruct_DW.Delay_DSTATE[k] = In1;
}
/* Outport: '<Root>/Out1' */
ForLoopConstruct_Y.Out1 = rtb_y;
}
The generated code contains code for the single for loop.
Close the model
bdclose(model)