通过传递可重用的子系统输出作为单独的参数来优化生成的代码
这个示例展示了如何将可重用子系统输出作为单独的参数传递,而不是作为指向存储在全局内存中的结构的指针传递,从而优化生成的代码。这种优化通过减少全局内存使用和消除从局部变量返回到全局块I/O结构的数据副本,节省了RAM消耗并提高了代码执行速度。
示例模型
考虑模型rtwdemo_reusable_sys_outputs.在这个模型中,可重用子系统输出为模型的根输出提供信息。
模型=“rtwdemo_reusable_sys_outputs”;open_system(模型);
生成代码没有这个优化
为该模型生成代码,同时将子系统输出作为结构引用传递。为构建和检查过程创建一个临时文件夹。
currentDir = pwd;[~,cgDir] = rtwdemodir();
构建模型。
rtwbuild(模型)
###启动模型的构建过程:rtwdemo_reusable_sys_output ###成功完成模型的构建过程:rtwdemo_reusable_sys_output
的部分代码片段rtwdemo_reusable_sys_outputs.c
.请注意全局块I/O结构和模型步进函数中来自该结构的数据副本。
cfile = fullfile(cgDir,“rtwdemo_reusable_sys_outputs_ert_rtw”,…“rtwdemo_reusable_sys_outputs.c”);rtwdemodbtype(用'/*输出和更新原子系统',…'/*模型初始化', 1,0);
/*输出和更新原子系统:'/ReusableSubsystem' */ static void ReusableSubsystem(real_T rtu_In1, real_T rtu_In2, real_T rtu_In3, DW_ReusableSubsystem *localDW){/*增益:' /增益' */ localDW->增益= 5.0 * rtu_In1;/*增益:' /Gain1' */ localDW->Gain1 = 6.0 * rtu_In2;/*增益:' /Gain2' */ localDW->Gain2 = 7.0 * rtu_In3;} /*模型步骤函数*/ void rtwdemo_reusable_sys_outputs_step(void){/*原子子系统的输出:'<根>/ReusableSubsystem' */ /* Inport: '<根>/In1'合并:* Inport: '<根>/In2' * Inport: '<根>/In3' */ ReusableSubsystem(rtU。三机一体,rtU。In2 rtU。In3 &rtDW.ReusableSubsystem_d);/*子系统输出结束:' /ReusableSubsystem' */ /*输出:' /Out1' */ rtY。Out1 = rtDW.ReusableSubsystem_d.Gain;/* Outport: ' /Out2' */ rtY。Out2 = rtDW.ReusableSubsystem_d.Gain1;/*输出:' /Out3' */ rtY。Out3 = rtDW.ReusableSubsystem_d.Gain2; }
启用此优化
打开“配置参数”对话框。
在优化窗格中,设置将可重用子系统输出传递为来
个人观点
.
或者,你可以使用命令行API来启用优化:
set_param(模型,“PassReuseOutputArgsAs”,“个人观点”);
使用此优化生成代码
通过这种优化,ReusableSubsystem
函数有三个输出参数,它们是对外部输出的直接引用。的rtDW
全局结构不再存在,数据从该结构复制到而无
(外部输出)结构不在生成的代码中。
构建模型。
rtwbuild(模型)
###启动模型的构建过程:rtwdemo_reusable_sys_output ###成功完成模型的构建过程:rtwdemo_reusable_sys_output
下面的代码片段是的一部分rtwdemo_reusable_sys_outputs.c
.观察优化后的代码。
rtwdemodbtype(用'/*输出和更新原子系统',…'/*模型初始化', 1,0);
/*输出和更新原子系统:'/ReusableSubsystem' */ static void ReusableSubsystem(real_T rtu_In1, real_T rtu_In2, real_T rtu_In3, real_T *rty_Out1, real_T *rty_Out2, real_T *rty_Out3){/*增益:' /增益' */ *rty_Out1 = 5.0 * rtu_In1;/ *获取:“< S1 > / Gain1”* / * rty_Out2 = 6.0 * rtu_In2;/ *获取:“< S1 > / Gain2”* / * rty_Out3 = 7.0 * rtu_In3;} /*模型步骤函数*/ void rtwdemo_reusable_sys_outputs_step(void){/*原子子系统的输出:' /ReusableSubsystem' */ /* Inport: ' /In1'合并:* Inport: ' /In2' * Inport: ' /In3' * Outport: ' /Out1' * Outport: ' /Out2' * Outport: ' /Out3' */ ReusableSubsystem(rtU。三机一体,rtU。In2 rtU。In3,而无。着干活,而无。Out2 &rtY.Out3);/*子系统输出结束:' /ReusableSubsystem' */}
关闭模型并进行清理。
bdclose rtwdemoclean(模型);cd (currentDir)