主要内容

用于代码重用的S函数

您可以为同一个子系统重用生成的代码,这些子系统出现在一个模型中的多个实例中,并且跨越引用的模型。有关为代码重用而生成子系统的代码的详细信息,请参见子系统功能的控制生成

S函数代码重用要求

为了在子系统中使用S-function实现代码重用,S-function必须满足以下要求:

  • s函数必须内联。

  • 从S函数生成的代码不得使用静态变量。

  • s函数必须初始化它的指针工作向量mdlstart.而不是之前。

  • S函数不得是将数据记录到工作区的宿函数。

  • s函数必须将其参数注册为运行时参数mdlsetworkwidths..为此,不能使用s函数sswritertwparameters.在它mdlRTW函数。

  • S函数不得是设备驱动程序。

此外,您的S函数必须设置SS_OPTION_WORKS_WITH_CODE_REUSE国旗的ssSetOptions函数。此标志表示您的S函数符合子系统代码重用的要求。如果设置标志并且您的S函数不符合要求,则代码生成器不会生成可重用的功能,并且您会看到警告。

S-函数在模型中重复使用

您可以将S函数放在可重用的库子系统中。在S函数文件中,设置两个标志:

如果你使用lefacy_code.生成S函数的工具,S函数选项金宝appsupportcodereuseacrodsmodels.指定跨包含S函数的子系统模型的代码重用。

仅当s函数不访问任何特定于模型的数据结构时,才配置s函数跨模型进行代码重用。此配置是必要的,因为生成的代码_Sharedutils.文件夹与生成的代码分开编译model_ert_rtw文件夹.中生成的可重用库子系统代码_Sharedutils.文件夹无法访问已声明的类型和宏model.h.可重用库子系统代码必须是独立的。有关详细信息,请参见从模型共享的库子系统生成可重复使用的代码

如果您的S函数使用外部标题文件中定义的自定义函数,请添加libaddtosystemcustomincludes(系统,incfilename)在S函数的TLC文件中的功能。例如,当您添加时LibAddtoSystemCustomIncludes(“company_math.h”)在你的.tlc文件,可重用的库子系统代码_Sharedutils.文件夹包括#company_math.h.头文件。

1.创建一个新的MATLAB工作文件夹。在MATLAB命令窗口,复制这些外部代码文件到您当前的MATLAB工作文件夹:

CurrentDir = PWD;[〜,cgdir] = rtwdemodir();Copyfile(FullFile(MatlaBroot,“工具箱”'RTW''RTWDEMOS'“doubleIt.c”));Copyfile(FullFile(MatlaBroot,“工具箱”'RTW''RTWDEMOS''doubleit.h'));

2.打开示例模型RTWDEMO_SFCN_RLS..此示例模型使用可重用库子系统的两个实例rtwdemo_sfcn_rls_lib.S函数sfun_mySrc在可重用库子系统内部,使用外部文件doubleIt.cdoubleIt.h

rtwdemo_sfcn_rls;

3.使用遗留代码工具生成s函数代码。在matlab命令窗口中使用这些命令:

def = legacy_code (“初始化”);def.sfunctionname =.“sfun_mySrc”;def.SourceFiles = {“doubleIt.c”};def.headerfiles = {'doubleit.h'};def.OutputFcnSpec ='Double Y1 = Doubleit(双U1)'

4.指定用于代码重用的s函数:

def.options.金宝appsupportcodereuseacrossmodels = true;

5.生成s函数代码TLC块文件。然后编译s函数。

Legacy_code('sfcn_tlc_generate'def);Legacy_code('sfcn_cmex_generate',def);Legacy_code(“编译”,def);
###开始编译sfun_mySrc mex('-I/tmp/ bdoc21b_1757077_5930_565c_47fc_88c3_9030b48aa95a /coderdemo', '-c', '-outdir', '/tmp/Bdoc21b_1757077_59824/tpa8da46ac_0be3_49f9_a680_6bd1b0507baf', '/tmp/Bdoc21b_1757077_59824/tpd5040000_565c_47fc_88c3_9030b48aa95a/coderdemo/doubleIt.c')用'gcc'构建。墨西哥人成功完成。-I/tmp/Bdoc21b_1757077_59824/tpd5040000_565c_47fc_88c3_9030b48aa95a/coderdemo', '/tmp/Bdoc21b_1757077_59824/tpa8da46ac_0be3_49f9_a680_6bd1b0507baf/double .o')使用'gcc'构建。墨西哥人成功完成。###完成编译sfun_mysrc ###退出

6.代码生成器创建s -函数文件sfun_mySrc.c及其TLC文件sfun_mySrc.tlc在您的MATLAB工作文件夹中。在里面sfun_mySrc.c文件中,代码生成器添加了以下规范:

file = fullfile('sfun_mysrc.c');rtwdemodbtype(文件,'*所有选项的形式SS_OPTION_'......'ssset金宝appsupportedforcodereuseacodels(s,1);', 1, 1);
*所有选项都以SS_OPTION_的形式存在,并记录在* matlabroot/simulink/include/ simstruct .h中。金宝app选项应该作为* *位或会一起ssSetOptions(年代,(SS_OPTION_name1 | SS_OPTION_name2)) * / ssSetOptions(年代,SS_OPTION_USE_TLC_WITH_ACCELERATOR | SS_OPTION_CAN_BE_CALLED_CONDITIONALLY | SS_OPTION_EXCEPTION_FREE_CODE | SS_OPTION_WORKS_WITH_CODE_REUSE | SS_OPTION_SFUNCTION_INLINED_FOR_RTW | SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME);ssSet金宝appSupportedForCodeReuseAcrossModels (S, 1);

在里面sfun_mySrc.c, 这SS_OPTION_WORKS_WITH_CODE_REUSE中设置的ssSetOptions功能和ssset金宝appsupportedforcodereuseacodels.设置为true。

7.在Simuli金宝appnk工具栏上,打开嵌入式编码器金宝app仿真软件编码器应用程序。

8.为模型生成代码。在这方面C代码选项卡,单击构建

evalc(“slbuild(“rtwdemo_sfcn_rls”)”);

代码生成器生成可在模型之间重用的可重用函数_Sharedutils.文件夹。模型参考层次结构中的模型共享此_Sharedutils.文件夹重用代码。对于本例,可重用函数在slprj grt / / _sharedutils / sfunc.c文件:

file = fullfile('slprj'“通”'_Sharedutils''sfunc.c');rtwdemodbtype(文件,'原子系统的输出和更新'......“rtb_sfun_mySrc”, 1, 1);
*输出和更新原子系统:* 'ReusableSubsystem' ('rtwdemo_sfcn_rls_lib:60') * 'ReusableSubsystem' ('rtwdemo_sfcn_rls_lib:60') */ void sfunc(real_T rtu_In1, B_sfunc_T *localB, DW_sfunc_T *localDW){/*本地块i/o变量*/ real_T rtb_sfun_mySrc;

S-函数在模型中重复使用

默认情况下,子系统中的s函数没有配置为模型中的代码重用。您可以在子系统中指定s函数,以便在模型中进行代码重用。在S-function文件中设置SS_OPTION_WORKS_WITH_CODE_REUSE国旗的ssSetOptions函数。这个标志表明你的s函数满足子系统代码重用的要求,并且为代码重用进行了配置。如果设置标志并且您的S函数不符合要求,则代码生成器不会生成可重用的功能,并且您会看到警告。

1.创建一个新的MATLAB工作文件夹并将这些外部代码文件复制到当前的MATLAB工作文件夹:

CurrentDir = PWD;[〜,cgdir] = rtwdemodir();Copyfile(FullFile(MatlaBroot,“工具箱”'RTW''RTWDEMOS'“doubleIt.c”));Copyfile(FullFile(MatlaBroot,“工具箱”'RTW''RTWDEMOS''doubleit.h'));

2.对于示例模型RTWDEMO_SFCN_RLS.,使用遗留代码工具生成s函数代码。不包括s功能选项金宝appsupportcodereuseacrodsmodels..在matlab命令窗口中使用这些命令:

def = legacy_code (“初始化”);def.sfunctionname =.“sfun_mySrc”;def.SourceFiles = {“doubleIt.c”};def.headerfiles = {'doubleit.h'};def.OutputFcnSpec ='Double Y1 = Doubleit(双U1)'

3.生成s函数代码TLC块文件。然后编译s函数。

Legacy_code('sfcn_tlc_generate'def);Legacy_code('sfcn_cmex_generate',def);Legacy_code(“编译”,def);
###开始编译sfun_mySrc MEX( ' - 我的/ tmp / Bdoc21b_1757077_59824 / tpb6525c4c_b124_4738_a8d8_7293a7c344c6 / coderdemo', '-c', '-outdir', '/ tmp目录/ Bdoc21b_1757077_59824 / tpfa0314e4_e194_4280_99d4_1a9bd17c843a',“/ tmp目录/ Bdoc21b_1757077_59824 / tpb6525c4c_b124_4738_a8d8_7293a7c344c6 / coderdemo /使用'gcc'挖掘.c')建筑。墨西哥人成功完成。MEX( 'sfun_mySrc.c', '-I / TMP / Bdoc21b_1757077_59824 / tpb6525c4c_b124_4738_a8d8_7293a7c344c6 / coderdemo', '/tmp/Bdoc21b_1757077_59824/tpfa0314e4_e194_4280_99d4_1a9bd17c843a/doubleIt.o')建筑与 'GCC'。墨西哥人成功完成。###完成编译sfun_mysrc ###退出

4.代码生成器创建S函数文件sfun_mySrc.c及其TLC文件sfun_mySrc.tlc在您的MATLAB工作文件夹中。

file = fullfile('sfun_mysrc.c');rtwdemodbtype(文件,'*所有选项的形式SS_OPTION_'......“SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME”, 1, 1);
*所有选项都以SS_OPTION_的形式存在,并记录在* matlabroot/simulink/include/ simstruct .h中。金宝app选项应该作为* *位或会一起ssSetOptions(年代,(SS_OPTION_name1 | SS_OPTION_name2)) * / ssSetOptions(年代,SS_OPTION_USE_TLC_WITH_ACCELERATOR | SS_OPTION_CAN_BE_CALLED_CONDITIONALLY | SS_OPTION_EXCEPTION_FREE_CODE | SS_OPTION_WORKS_WITH_CODE_REUSE | SS_OPTION_SFUNCTION_INLINED_FOR_RTW | SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME

在里面sfun_mySrc.c文件,代码生成器添加SS_OPTION_WORKS_WITH_CODE_REUSE国旗的ssSetOptions默认情况下,但不包括ssset金宝appsupportedforcodereuseacodels.规范,防止s功能在模型之间被重用。

5.在Simuli金宝appnk工具栏上,打开嵌入式编码器金宝app仿真软件编码器应用程序。

6.为模型生成代码。在这方面C代码选项卡,单击构建

evalc(“slbuild(“rtwdemo_sfcn_rls”)”);

代码生成器为子系统产生可重复使用的功能RTWDEMO_SFCN_RLS.c.文件,它在_Sharedutils.文件夹。此代码可以在模型中重用,但不会在模型引用层次结构中重用:

file = fullfile(“rtwdemo_sfcn_rls_grt_rtw”'rtwdemo_sfcn_rls.c');rtwdemodbtype(文件,'void sfunc'......'localdw-> unitdelay_dstate = rtb_sfun_mysrc;', 1, 1);
void sfunc_Init(DW_sfunc_T *localDW){/*初始化条件的UnitDelay: '/单位延迟' */ localDW->UnitDelay_DSTATE = 0.0;} /* *输出和更新原子系统:* '<根>/ReusableSubsystem1' * '<根>/ReusableSubsystem2' */ void sfunc(real_T rtu_In1, B_sfunc_T *localB, DW_sfunc_T *localDW){/*本地块i/o变量*/ real_T rtb_sfun_mySrc;/* UnitDelay: '/Unit Delay' */ localB->UnitDelay = localDW->UnitDelay_DSTATE;/* S-Function (sfun_mySrc): '/sfun_mySrc' */ rtb_sfun_mySrc = doubleIt(rtu_In1);/*更新UnitDelay_DSTATE: '/单位延迟' */ localDW->UnitDelay_DSTATE = rtb_sfun_mySrc;

相关的话题