向量运算优化
此示例展示了 Simulink®Coder™ 如何通过将生成向量的模块输出设置为标量来优化生成的代码,例如 Mux、Sum、Gain 和 Bus 等模块。此优化通过用局部变量替换临时局部数组来减少堆栈内存。
示例模型
在模型 rtwdemo_VectorOptimization 中,Gain 模块 G1 和 G2 的输出是向量信号 tmp1 和 tmp2。这些向量的宽度为 10。
model = 'rtwdemo_VectorOptimization'; open_system(model); set_param(model, 'SimulationCommand', 'update')

生成代码
编译模型。
slbuild(model)
### Searching for referenced models in model 'rtwdemo_VectorOptimization'. ### Total of 1 models to build. ### Starting build procedure for: rtwdemo_VectorOptimization ### Successful completion of build procedure for: rtwdemo_VectorOptimization Build Summary Top model targets: Model Build Reason Status Build Duration ============================================================================================================================= rtwdemo_VectorOptimization Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 6.3214s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 7.1454s
优化后的代码在 rtwdemo_VectorOptimization.c 中。信号 tmp1 和 tmp2 是局部变量 rtb_tmp1 和 rtb_tmp2。
cfile = fullfile('rtwdemo_VectorOptimization_grt_rtw',... 'rtwdemo_VectorOptimization.c'); coder.example.extractLines(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_VectorOptimization_step(void)
{
real_T rtb_Sum3_0;
real_T rtb_tmp1_0;
real_T rtb_tmp2_0;
int32_T i;
for (i = 0; i < 10; i++) {
/* Gain: '<Root>/G2' incorporates:
* UnitDelay: '<Root>/X2'
*/
rtb_tmp2_0 = 0.3 * rtwdemo_VectorOptimization_DW.X2_DSTATE[i];
/* Gain: '<Root>/G1' incorporates:
* UnitDelay: '<Root>/X1'
*/
rtb_tmp1_0 = 0.2 * rtwdemo_VectorOptimization_DW.X1_DSTATE[i];
/* Sum: '<Root>/Sum3' incorporates:
* Gain: '<Root>/G3'
* Inport: '<Root>/In2'
* Sum: '<Root>/Sum1'
* Sum: '<Root>/Sum2'
* UnitDelay: '<Root>/X3'
*/
rtb_Sum3_0 = ((rtwdemo_VectorOptimization_U.In2[i] - 0.4 *
rtwdemo_VectorOptimization_DW.X3_DSTATE[i]) - rtb_tmp2_0) -
rtb_tmp1_0;
/* Outport: '<Root>/Out2' */
rtwdemo_VectorOptimization_Y.Out2[i] = rtb_Sum3_0;
/* Update for UnitDelay: '<Root>/X3' */
rtwdemo_VectorOptimization_DW.X3_DSTATE[i] = rtb_tmp2_0;
/* Update for UnitDelay: '<Root>/X2' */
rtwdemo_VectorOptimization_DW.X2_DSTATE[i] = rtb_tmp1_0;
/* Update for UnitDelay: '<Root>/X1' */
rtwdemo_VectorOptimization_DW.X1_DSTATE[i] = rtb_Sum3_0;
}
}
关闭模型和代码生成报告。
bdclose(model)