文档

通过传递可重用的子系统输出作为单独的参数来优化生成的代码

这个示例展示了如何将可重用子系统输出作为单独的参数传递,而不是作为指向存储在全局内存中的结构的指针传递,从而优化生成的代码。这种优化通过减少全局内存使用和消除从局部变量返回到全局块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; }

启用此优化

  1. 打开“配置参数”对话框。

  2. 优化窗格中,设置将可重用子系统输出传递为个人观点

或者,你可以使用命令行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)

另请参阅

相关的话题