主要内容

S-Functions代码重用

您可以重用相同的子系统生成的代码,发生在多个实例模型和跨中引用的模型。更多信息子系统的代码生成代码重用,明白了生成子系统的代码作为单独的函数和文件

功能代码重用的需求

利用s函数代码重用的一个子系统,s函数必须满足这些要求:

  • 必须内联函数。

  • 生成的代码的功能不能使用静态变量。

  • 功能必须初始化指针工作向量mdlStart而不是之前。

  • 日志数据的功能不能水槽的工作区。

  • 功能必须登记其参数在运行时参数mdlSetWorkWidths。为了这个目的,功能不能使用ssWriteRTWParameters在其mdlRTW函数。

  • s函数不能是一个设备驱动程序。

另外,你的s函数必须设置SS_OPTION_WORKS_WITH_CODE_REUSE国旗的ssSetOptions函数。这个标志表明子系统功能满足要求代码重用。如果标志设置和功能不满足要求,代码生成器不生成一个可重用的功能,你会看到一个警告。

S-Functions跨模型重用

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

如果你使用legacy_code工具来生成你的s函数,函数的选择万博1manbetxsupportCodeReuseAcrossModels指定的子系统之间的代码重用模型包含了功能。

配置功能之间的代码重用模型只有在功能没有访问任何的模型相关的数据结构。这个配置是必要的,因为生成的代码_sharedutils文件夹分开编译生成的代码model_ert_rtw文件夹。可重用的库子系统生成的代码_sharedutils文件夹不可以访问中声明的类型和宏model.h。可重用的库子系统代码必须独立。有关更多信息,请参见从图书馆子系统生成可重用的代码之间共享模型

如果您的s函数使用自定义函数外部的头文件中定义,添加incFileName LibAddtoSystemCustomIncludes(系统)在你的s函数的TLC文件函数。例如,当你添加LibAddtoSystemCustomIncludes (“company_math.h”)在你的.tlc文件,代码的可重用的库子系统_sharedutils文件夹包含了# company_math.h头文件。

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

currentDir = pwd;[~,cgDir] = rtwdemodir ();拷贝文件(fullfile (matlabroot,“工具箱”,“环球套票”,“rtwdemos”,“doubleIt.c”));拷贝文件(fullfile (matlabroot,“工具箱”,“环球套票”,“rtwdemos”,“doubleIt.h”));

2。打开示例模型rtwdemo_sfcn_rls。这个示例模型使用可重用的库子系统的两个实例rtwdemo_sfcn_rls_lib。的功能sfun_mySrc在可重用的库子系统使用外部文件doubleIt.cdoubleIt.h

rtwdemo_sfcn_rls;

3所示。遗留代码生成功能代码通过使用工具。在MATLAB命令窗口中使用这些命令:

def = legacy_code (“初始化”);def.SFunctionName =“sfun_mySrc”;def.SourceFiles = {“doubleIt.c”};def.HeaderFiles = {“doubleIt.h”};def.OutputFcnSpec ='双日元= doubleIt(双u1) ';

4所示。指定代码重用的功能:

def.Options。万博1manbetxsupportCodeReuseAcrossModels = true;

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

legacy_code (“sfcn_tlc_generate”def);legacy_code (“sfcn_cmex_generate”def);legacy_code (“编译”def);
# # #开始编译sfun_mySrc墨西哥人(“我/ tmp / Bdoc23a_2213998_2771220 / tped021500_1b6d_4988_b1b9_319bc1809ca9 coderdemo”、“c”,“-outdir”、“/ tmp / Bdoc23a_2213998_2771220 / tpc39ac17e_c00c_470a_97eb_b3187986bce4”、“/ tmp / Bdoc23a_2213998_2771220 / tped021500_1b6d_4988_b1b9_319bc1809ca9 / coderdemo / doubleIt.c”)建设与gcc。墨西哥人成功完成。墨西哥人(“sfun_mySrc。c ', ' - i / tmp / Bdoc23a_2213998_2771220 / tped021500_1b6d_4988_b1b9_319bc1809ca9 coderdemo”、“/ tmp / Bdoc23a_2213998_2771220 / tpc39ac17e_c00c_470a_97eb_b3187986bce4 doubleIt.o”)建设与“gcc”。墨西哥人成功完成。# # #完成编译sfun_mySrc # # #退出

6。代码生成器创建函数文件sfun_mySrc.c和它的薄层色谱文件sfun_mySrc.tlcMATLAB的工作目录。在sfun_mySrc.c文件,代码生成器添加这些规范:

文件= fullfile (“sfun_mySrc.c”);rtwdemodbtype(文件,*所有选项的形式SS_OPTION_ <名称>”,“ssSet万博1manbetxSupportedForCodeReuseAcrossModels(年代,1),“,1,1);
*所有选项的形式SS_OPTION_ <名称>,并记录在* matlabroot /模型/ include / simstruc.h。万博1manbetx选项应该作为* *位或会一起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万博1manbetxSupportedForCodeReuseAcrossModels (S, 1);

sfun_mySrc.c,SS_OPTION_WORKS_WITH_CODE_REUSE国旗中设置ssSetOptions功能和ssSet万博1manbetxSupportedForCodeReuseAcrossModels被设置为true。

7所示。在仿真软件上®万博1manbetx将来发布,打开嵌入式编码器万博1manbetx仿真软件编码器应用程序。

8。为模型生成代码。在C代码选项卡上,单击构建

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

代码生成器生成一个可重用的功能,可以跨模型的重用_sharedutils文件夹中。模型在模型参考分享这个层次_sharedutils文件夹中重用代码。对于这个示例,可重用函数中生成slprj grt / / _sharedutils / sfunc.c文件:

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

S-Functions重用在一个模型

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

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

currentDir = pwd;[~,cgDir] = rtwdemodir ();拷贝文件(fullfile (matlabroot,“工具箱”,“环球套票”,“rtwdemos”,“doubleIt.c”));拷贝文件(fullfile (matlabroot,“工具箱”,“环球套票”,“rtwdemos”,“doubleIt.h”));

2。对于示例模型rtwdemo_sfcn_rls遗留代码,生成功能代码通过使用工具。不包括功能选项万博1manbetxsupportCodeReuseAcrossModels。在MATLAB命令窗口中使用这些命令:

def = legacy_code (“初始化”);def.SFunctionName =“sfun_mySrc”;def.SourceFiles = {“doubleIt.c”};def.HeaderFiles = {“doubleIt.h”};def.OutputFcnSpec ='双日元= doubleIt(双u1) ';

3所示。生成函数代码TLC块文件。然后编译功能。

legacy_code (“sfcn_tlc_generate”def);legacy_code (“sfcn_cmex_generate”def);legacy_code (“编译”def);
# # #开始编译sfun_mySrc墨西哥人(“我/ tmp / Bdoc23a_2213998_2771220 / tpf611d2a5_6b93_4655_a92e_f4794f5ebf85 coderdemo”、“c”,“-outdir”、“/ tmp / Bdoc23a_2213998_2771220 / tp123453a5_39ca_40d6_a28d_a959b63598c7”、“/ tmp / Bdoc23a_2213998_2771220 / tpf611d2a5_6b93_4655_a92e_f4794f5ebf85 / coderdemo / doubleIt.c”)建设与gcc。墨西哥人成功完成。墨西哥人(“sfun_mySrc。c ', ' - i / tmp / Bdoc23a_2213998_2771220 / tpf611d2a5_6b93_4655_a92e_f4794f5ebf85 coderdemo”、“/ tmp / Bdoc23a_2213998_2771220 / tp123453a5_39ca_40d6_a28d_a959b63598c7 doubleIt.o”)建设与“gcc”。墨西哥人成功完成。# # #完成编译sfun_mySrc # # #退出

4所示。代码生成器创建函数文件sfun_mySrc.c和它的薄层色谱文件sfun_mySrc.tlcMATLAB的工作目录。

文件= fullfile (“sfun_mySrc.c”);rtwdemodbtype(文件,*所有选项的形式SS_OPTION_ <名称>”,“SS_OPTION_DISALLOW_CONSTANT_SAMPLE_TIME”,1,1);
*所有选项的形式SS_OPTION_ <名称>,并记录在* matlabroot /模型/ include / simstruc.h。万博1manbetx选项应该作为* *位或会一起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万博1manbetxSupportedForCodeReuseAcrossModels规范,防止功能跨模型重用。

5。在仿真软件上将万博1manbetx来发布,打开嵌入式编码器万博1manbetx仿真软件编码器应用程序。

6。为模型生成代码。在C代码选项卡上,单击构建

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

代码生成器生成一个可重用的功能的子系统rtwdemo_sfcn_rls.c文件,它是外_sharedutils文件夹中。这段代码可以重用模型而不是整个模型中引用层次结构:

文件= fullfile (“rtwdemo_sfcn_rls_grt_rtw”,“rtwdemo_sfcn_rls.c”);rtwdemodbtype(文件,“空白sfunc”,“localDW - > UnitDelay_DSTATE = rtb_sfun_mySrc;”,1,1);
空白sfunc_Init (DW_sfunc_T * localDW) {/ * InitializeConditions UnitDelay: < S1 > /单元的延迟* / localDW - > UnitDelay_DSTATE = 0.0;}/ * *输出和更新原子系统:* ' < Root > / ReusableSubsystem1 ' * ' < Root > / ReusableSubsystem2 ' * /空白sfunc (real_T rtu_In1, B_sfunc_T * localB DW_sfunc_T * localDW){/ *本地块i / o变量* / real_T rtb_sfun_mySrc;/ * UnitDelay: < S1 > /单元的延迟* / localB - > UnitDelay = localDW - > UnitDelay_DSTATE;/ *功能(sfun_mySrc):“< S1 > / sfun_mySrc”* / rtb_sfun_mySrc = doubleIt (rtu_In1);/ * UnitDelay更新:< S1 > /单元的延迟* / localDW - > UnitDelay_DSTATE = rtb_sfun_mySrc;

相关的话题