生成代码中的函数重用
此示例说明如何配置原子子系统来生成可重用的代码。要指定为子系统生成的代码作为原子单元执行,请在“模块参数”对话框中选择视为原子单元参数。该参数会启用代码生成选项卡上的函数打包参数。函数打包参数有以下四种设置:
Inline:内嵌子系统代码Nonreusable function:I/O 作为全局数据传递的函数Reusable function:I/O 作为函数参量传递的函数Auto:让 Simulink Coder 基于上下文进行优化
Reusable function 和 Auto 设置允许代码生成器重用子系统代码。Reusable function 和 Nonreusable function 设置支持函数名称选项、函数名称以及文件名选项参数。
如果您有 Embedded Coder® 许可证,您可以配置一个不可重用子系统来接受参量。
示例模型
GeneratedCodeFunctionReuse 模型包含两个相同的子系统,即 SS1 和 SS2。对于这些子系统,函数打包参数设置为 Reusable function,函数名称参数为 myfun。子系统是参数化的封装子系统。要查看封装子系统的内容,请右键点击子系统模块并选择封装 > 查看封装内部。
model = 'GeneratedCodeFunctionReuse';
open_system(model);

生成和检查代码
打开 Simulink Coder 或 Embedded Coder。然后,生成并检查代码。
slbuild(model)
### Searching for referenced models in model 'GeneratedCodeFunctionReuse'. ### Total of 1 models to build. ### Starting build procedure for: GeneratedCodeFunctionReuse ### Successful completion of build procedure for: GeneratedCodeFunctionReuse Build Summary Top model targets: Model Build Reason Status Build Duration ============================================================================================================================= GeneratedCodeFunctionReuse Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 10.326s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.98s
cfile=fullfile(pwd, 'GeneratedCodeFunctionReuse_grt_rtw', 'GeneratedCodeFunctionReuse.c'); coder.example.extractLines(cfile, '/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void GeneratedCodeFunctionReuse_step(void)
{
/* Outputs for Atomic SubSystem: '<Root>/SS1' */
/* Inport: '<Root>/In1' incorporates:
* Inport: '<Root>/In2'
*/
myfun(GeneratedCodeFunctionReuse_U.In1, GeneratedCodeFunctionReuse_U.In2,
GeneratedCodeFunctionReuse_P.T1Data,
GeneratedCodeFunctionReuse_P.T1Break, &GeneratedCodeFunctionReuse_B.SS1);
/* End of Outputs for SubSystem: '<Root>/SS1' */
/* Outport: '<Root>/Out1' */
GeneratedCodeFunctionReuse_Y.Out1 =
GeneratedCodeFunctionReuse_B.SS1.LookupTable;
/* Outputs for Atomic SubSystem: '<Root>/SS2' */
/* Inport: '<Root>/In1' incorporates:
* Inport: '<Root>/In2'
*/
myfun(GeneratedCodeFunctionReuse_U.In1, GeneratedCodeFunctionReuse_U.In2,
GeneratedCodeFunctionReuse_P.T2Data,
GeneratedCodeFunctionReuse_P.T2Break, &GeneratedCodeFunctionReuse_B.SS2);
/* End of Outputs for SubSystem: '<Root>/SS2' */
/* Outport: '<Root>/Out2' */
GeneratedCodeFunctionReuse_Y.Out2 =
GeneratedCodeFunctionReuse_B.SS2.LookupTable;
}
在模型单步函数中,有两个对可重用函数 myfun 的调用。封装参量 T1Break、T1Data、T2Break 和 T2Data 是函数参量。
将函数打包参数更改为 Inline。
set_param('GeneratedCodeFunctionReuse/SS1','RTWSystemCode','Inline') set_param('GeneratedCodeFunctionReuse/SS2','RTWSystemCode','Inline')
生成并检查代码。
slbuild(model)
### Searching for referenced models in model 'GeneratedCodeFunctionReuse'. ### Total of 1 models to build. ### Starting build procedure for: GeneratedCodeFunctionReuse ### Successful completion of build procedure for: GeneratedCodeFunctionReuse Build Summary Top model targets: Model Build Reason Status Build Duration ========================================================================================================= GeneratedCodeFunctionReuse Generated code was out of date. Code generated and compiled. 0h 0m 5.5811s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 5.9919s
cfile=fullfile(pwd, 'GeneratedCodeFunctionReuse_grt_rtw', 'GeneratedCodeFunctionReuse.c'); coder.example.extractLines(cfile, '/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void GeneratedCodeFunctionReuse_step(void)
{
real_T Out1_tmp;
/* Outputs for Atomic SubSystem: '<Root>/SS2' */
/* Outputs for Atomic SubSystem: '<Root>/SS1' */
/* Sum: '<S1>/Sum' incorporates:
* Inport: '<Root>/In1'
* Inport: '<Root>/In2'
* Sum: '<S2>/Sum'
*/
Out1_tmp = GeneratedCodeFunctionReuse_U.In1 + GeneratedCodeFunctionReuse_U.In2;
/* End of Outputs for SubSystem: '<Root>/SS2' */
/* Outport: '<Root>/Out1' incorporates:
* Lookup_n-D: '<S1>/Lookup Table'
* Sum: '<S1>/Sum'
*/
GeneratedCodeFunctionReuse_Y.Out1 = look1_binlx(Out1_tmp,
GeneratedCodeFunctionReuse_P.T1Break, GeneratedCodeFunctionReuse_P.T1Data,
10U);
/* End of Outputs for SubSystem: '<Root>/SS1' */
/* Outputs for Atomic SubSystem: '<Root>/SS2' */
/* Outport: '<Root>/Out2' incorporates:
* Lookup_n-D: '<S2>/Lookup Table'
*/
GeneratedCodeFunctionReuse_Y.Out2 = look1_binlx(Out1_tmp,
GeneratedCodeFunctionReuse_P.T2Break, GeneratedCodeFunctionReuse_P.T2Data,
10U);
/* End of Outputs for SubSystem: '<Root>/SS2' */
}
在模型单步函数中,子系统代码是内联的。
将函数打包参数更改为 Nonreusable function。对于 SS2,将函数名称参数更改为 myfun2。
set_param('GeneratedCodeFunctionReuse/SS1','RTWSystemCode','Nonreusable function') set_param('GeneratedCodeFunctionReuse/SS2','RTWSystemCode','Nonreusable function') set_param('GeneratedCodeFunctionReuse/SS2','RTWFcnName','myfun2')
生成并检查代码。
slbuild(model)
### Searching for referenced models in model 'GeneratedCodeFunctionReuse'. ### Total of 1 models to build. ### Starting build procedure for: GeneratedCodeFunctionReuse ### Successful completion of build procedure for: GeneratedCodeFunctionReuse Build Summary Top model targets: Model Build Reason Status Build Duration ========================================================================================================= GeneratedCodeFunctionReuse Generated code was out of date. Code generated and compiled. 0h 0m 4.6479s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 5.0306s
cfile=fullfile(pwd, 'GeneratedCodeFunctionReuse_grt_rtw', 'GeneratedCodeFunctionReuse.c'); coder.example.extractLines(cfile, '/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void GeneratedCodeFunctionReuse_step(void)
{
/* Outputs for Atomic SubSystem: '<Root>/SS1' */
myfun();
/* End of Outputs for SubSystem: '<Root>/SS1' */
/* Outputs for Atomic SubSystem: '<Root>/SS2' */
myfun2();
/* End of Outputs for SubSystem: '<Root>/SS2' */
}
模型单步函数包含对函数 myfun 和 myfun2 的调用。这些函数具有 void-void 接口。
将函数打包参数更改为 Auto。
set_param('GeneratedCodeFunctionReuse/SS1','RTWSystemCode','Auto') set_param('GeneratedCodeFunctionReuse/SS2','RTWSystemCode','Auto')
对于 auto 设置,Simulink Coder 会选择最佳格式。对于此模型,最佳格式是可重用函数。