文档

使用遗留代码工具将外部代码调用导入到生成的代码中

遗留代码工具和代码生成

您可以使用Simulink金宝app®遗留代码工具为遗留代码或自定义代码生成完全内联的C MEX s函数。s函数针对嵌入式组件(如设备驱动程序和查找表)进行了优化,并且它们调用现有的C或c++函数。

请注意

遗留代码工具可以与c++函数交互,但不能与c++对象交互。要解决这个问题,以便该工具能够与c++对象交互,请参见遗留代码工具的限制(金宝app模型)。

您可以使用该工具:

  • 编译并构建生成的s函数进行仿真。

  • 生成一个屏蔽的S-Function块它被配置为调用现有外部代码。

如果您想在您打算为其生成代码的模型中包含这些类型的s函数,请使用该工具生成TLC块文件。TLC块文件指定为模型生成的代码如何调用现有的C或c++函数。

如果s -函数依赖于除包含s -函数动态加载可执行文件的文件夹之外的文件夹中的文件,则使用该工具生成一个sFunction_makecfg.mrtwmakecfg.m文件的s函数。当您构建包含s函数的模型时,生成文件将维护这些依赖关系。例如,对于一些应用程序,例如自定义目标,您可能希望将文件定位到目标特定的位置。构建过程寻找sFunction_makecfg.mrtwmakecfg.m在与S-function动态加载可执行文件相同的文件夹中,并调用文件中的函数。

有关更多信息,请参见使用遗留代码工具集成C函数(金宝app模型)。

为代码生成生成内联的S-Function文件

根据应用程序的代码生成需求,为使用s函数的模型生成代码,请执行以下任一操作:

  • 生成一个. cpp文件的内联s函数。在“遗留代码工具”数据结构中,设置Options.singleCPPMexFile字段真正的然后再从已有的C函数生成s函数源文件。例如:

    def.Options.singleCPPMexFile = true;legacy_code (sfcn_cmex_generate, def);

  • 为内联s函数生成一个源文件和一个TLC块文件。例如:

    def.Options.singleCPPMexFile = false;legacy_code (sfcn_cmex_generate, def);legacy_code (sfcn_tlc_generate, def);

singleCPPMexFile局限性

您不能设置singleCPPMexFile字段真正的如果

  • Options.language =“c++”

  • 对象使用下列Simulink对象之一金宝appIsAlias属性设置为真正的

    • 金宝app仿真软件。公共汽车

    • 金宝app仿真软件。AliasType

    • 金宝app仿真软件。NumericType

  • 遗留代码工具功能规范包括void *void * *表示状态参数的标量工作数据

  • HeaderFiles遗留代码工具结构的字段指定多个头文件

将代码样式设置应用到遗留函数

将代码样式的模型配置参数应用到遗留函数:

  1. 初始化遗留代码工具数据结构。例如:

    Def = legacy_code('初始化');
  2. 在数据结构中设置Options.singleCPPMexFile字段真正的.例如:

    def.Options.singleCPPMexFile = true;

要检查设置,输入:

def.Options.singleCPPMexFile

singleCPPMexFile局限性

您不能设置singleCPPMexFile字段真正的如果

  • Options.language =“c++”

  • 对象使用下列Simulink对象之一金宝appIsAlias属性设置为真正的

    • 金宝app仿真软件。公共汽车

    • 金宝app仿真软件。AliasType

    • 金宝app仿真软件。NumericType

  • 遗留代码工具功能规范包括void *void * *表示状态参数的标量工作数据

  • HeaderFiles遗留代码工具结构的字段指定多个头文件

地址依赖于不同位置的文件

默认情况下,遗留代码工具假定s函数所依赖的文件与s函数可动态加载的可执行文件位于同一文件夹中。如果s函数依赖于驻留在其他地方的文件,并且您正在使用模板makefile构建过程,则生成一个sFunction_makecfg.mrtwmakecfg.m文件对于s函数。例如,如果遗留代码工具数据结构将编译资源定义为路径名,则可能生成此文件。

来生成sFunction_makecfg.mrtwmakecfg.m文件,调用legacy_code函数与“sfcn_makecfg_generate”“rtwmakecfg_generate”作为第一个参数,遗留代码工具数据结构的名称作为第二个参数。例如:

legacy_code (sfcn_makecfg_generate, lct_spec);

如果您在同一个文件夹中使用多个注册文件,并为每个文件生成一个s函数,只需对legacy_code,呼唤legacy_code指定“sfcn_makecfg_generate”“rtwmakecfg_generate”必须对所有注册文件通用。有关更多信息,请参见处理多个注册文件(金宝app模型)。

例如,如果你定义def作为遗留代码工具结构的数组,您调用legacy_code“sfcn_makecfg_generate”一次。

Defs = [defs1(:);defs2(:);defs3(:)];legacy_code (sfcn_makecfg_generate, def);

有关更多信息,请参见构建对s -金宝app function的支持

为模拟和代码生成部署s函数

您可以部署s函数您用遗留代码工具生成的,以便其他人可以使用它们。要部署s函数进行模拟和代码生成,请共享以下文件:

  • 注册文件

  • 编译后可动态加载的可执行文件

  • TLC块文件

  • sFunction_makecfg.mrtwmakecfg.m文件

  • 生成的s函数所依赖的头文件、源文件和包含文件

当你使用这些部署文件时:

  • 在使用Simulink模型中部署的文件之前,将包含s函数文件的文件夹添加到金宝appMATLAB中®路径。

  • 如果遗留代码工具数据结构将所需文件注册为绝对路径,且文件的位置发生更改,则重新生成sFunction_makecfg.mrtwmakecfg.m文件。

集成外部c++对象

遗留代码工具可以与c++函数交互,但不能与c++对象交互。使用前面的示例作为起点,下面是如何绕过此限制的示例。

  • 的类定义加法器在一个新文件中adder_cpp.hpp.添加三个新宏,动态分配新的加法器对象,调用该方法add_one (),释放分配的内存。每个宏都有一个指向对象的指针加法器对象。因为遗留代码工具调用的每个函数都必须具有类似c的签名,所以指针被缓存并作为void *.然后必须显式转换为加法器*在宏中。的新类定义加法器

    #ifndef _ADDER_CPP_ #定义_ADDER_CPP_类加法器{private: int int_state;Public: adder(): int_state(0) {};Int add_one(Int increment);Int get_val(){返回int_state;};};//实现为宏的方法包装器#define createAdder(work1) \ *(work1) = new addder #define deleteAdder(work1) \ delete(static_cast(*(work1))) #define adderOutput(work1, u1) \ (static_cast((work1)))->add_one(u1) #endif /* _ADDER_CPP_ */
  • 更新adder_cpp.cpp.通过类修改,而不是一个全局实例,每个生成的s函数都管理自己的实例加法器对象。

    #include " adder_cppp .hpp" int addder::add_one(int increment) {int_state += increment;返回int_state;}
  • 更新rtwdemo_sfun_adder_cpp.cpp更改如下:

    • StartFcnSpec调用分配新对象的宏加法器对象,并缓存指针。

      def.StartFcnSpec = 'createAdder(void **work1)';
    • OutputFcnSpec调用调用该方法的宏add_one ()并提供特定的s函数加法器对象的指针。

      def.OutputFcnSpec = 'int32 y1 = adderOutput(void *work1, int32 u1)';
    • TerminateFcnSpec调用释放内存的宏。

      def.TerminateFcnSpec = 'deleteAdder(void **work1)';

遗留代码工具示例

集成通过值和地址传递输入参数的外部C函数

这个例子展示了如何使用遗留代码工具集成遗留C函数,这些函数按值和地址传递输入参数。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

  • FLT filterV1(const FLT信号,const FLT prevSignal, const FLT增益)

  • FLT filterV2(const FLT*信号,const FLT prevSignal, const FLT增益)

FLT是float的类型定义。遗留源代码在文件中your_types.h,myfilter.h,filterV1.c,filterV2.c

注意在两个结构中定义的OutputFcnSpec的区别;第一种情况指定第一个输入参数按值传递,而第二种情况指定按指针传递。

Defs = [];% rtwdemo_sfun_filterV1Def = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_filterV1”;def.OutputFcnSpec ='单y1 = filterV1(单u1,单u2,单p1)';def.HeaderFiles = {“myfilter.h”};def.SourceFiles = {“filterV1.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};Defs = [Defs;def);% rtwdemo_sfun_filterV2Def = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_filterV2”;def.OutputFcnSpec ='单y1 = filterV2(单u1[1],单u2,单p1)';def.HeaderFiles = {“myfilter.h”};def.SourceFiles = {“filterV2.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};Defs = [Defs;def);

生成模拟s函数

要根据输入参数“defs”提供的描述生成C-MEX s -函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟中调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_filterV1.c而且rtwdemo_sfun_filterV2.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的模拟s函数

生成C-MEX S-function源文件后,要编译用于Simulink®仿真的S-function,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_filterV1 mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228687/tp9b66b501/ex19632214', '-c', '-outdir', '/tmp/Bdoc19b_1305395_228687/tpff4970cf_6e54_4780_bee0_8458c09b1ced', '/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/filterV1.c')MEX成功完成。mex('rtwdemo_sfun_filterV1.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228687/tp9b66b501/ex19632214', '/tmp/Bdoc19b_1305395_228687/tpff4970cf_6e54_4780_bee0_8458c09b1ced/filterV1.o')使用'gcc'编译。MEX成功完成。##退出##开始编译rtwdemo_sfun_filterV2 mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228687/tp9b66b501/ex19632214', '-c', '-outdir', '/tmp/Bdoc19b_1305395_228687/tp943ed46d_9e36_4d5e_b71d_6a271fa22b96', '/mathworks/dev /bat/Bdoc19b/build/matlab/ rtw/rtwdemos/rtwdemo_lct_src/filterV2.c')MEX成功完成。mex('rtwdemo_sfun_filterV2.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228687/tp9b66b501/ex19632214', '/tmp/Bdoc19b_1305395_228687/tp943ed46d_9e36_4d5e_b71d_6a271fa22b96/filterV2.o')使用'gcc'编译。MEX成功完成。###完成编译rtwdemo_sfun_filterV2 ###退出

为代码生成生成TLC块文件

编译s -函数并在模拟中使用它们之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果不生成TLC块文件,并且试图为包含s函数的模型生成代码,则代码生成失败。s -函数的TLC块文件是rtwdemo_sfun_filterV1.tlc而且rtwdemo_sfun_filterV2.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果S-functions所需的源文件和头文件与S-functions不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成屏蔽s函数块,用于调用生成的s函数

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为'slblock_generate',以生成调用S-function的屏蔽S-function块。该软件将这些块放入一个新的模型中。从那里,您可以将它们复制到现有的模型中。

legacy_code (“slblock_generate”def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_filter显示模型与遗留代码的集成。子系统TestFilter通过生成s函数充当对遗留C函数的调用的工具,单元延迟用于存储以前的输出值。

open_system (“rtwdemo_lct_filter”) open_system (“rtwdemo_lct_filter / TestFilter”) sim卡(“rtwdemo_lct_filter”

集成将Output参数作为Return参数传递的外部C函数

这个例子展示了如何使用遗留代码工具集成遗留C函数,这些函数将输出作为返回参数传递。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

FLT增益标量(const FLT in, const FLT gain)

FLT是float的类型定义。遗留源代码在文件中your_types.h,gain.h,gainScalar.c

% rtwdemo_sfun_gain_scalarDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_gain_scalar”;def.OutputFcnSpec ='单个y1 = gainScalar(单个u1,单个p1)';def.HeaderFiles = {“gain.h”};def.SourceFiles = {“gainScalar.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_gain_scalar.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_gain_scalar mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229314/tpd784f5ed/ex09148220', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229314/ t0a468b2f_a193_454f_b9af_6f88a5c78fba ', '/mathworks/devel/bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ gainscala .c')MEX成功完成。mex('rtwdemo_sfun_gain_scala .c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229314/tpd784f5ed/ex09148220', '/tmp/Bdoc19b_1305395_229314/ t0a468b2f_a193_454f_b9af_6f88a5c78fba / gainscala .o')使用'gcc'编译。MEX成功完成。##完成编译rtwdemo_sfun_gain_scalar ###退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果您没有生成TLC块文件,并且试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_gain_scalar.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为“slblock_generate”,以生成调用该S-function的屏蔽S-function块。软件将块放入一个新的模型中。从那里,您可以将它复制到一个现有的模型。

legacy_code (“slblock_generate”def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_gain显示模型与遗留代码的集成。子系统TestGain充当通过generate s函数调用遗留C函数的工具。

open_system (“rtwdemo_lct_gain”) open_system (“rtwdemo_lct_gain / TestGain”) sim卡(“rtwdemo_lct_gain”

集成外部c++对象方法

通过使用遗留代码工具集成遗留c++对象方法。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成c++ MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成一个块TLC文件和可选的rtwmakecfg。M文件,该文件在代码生成期间调用遗留代码。

提供遗留函数规范

遗留代码工具提供的函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code()来初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).这个例子中遗留c++类的定义是:

类加法器{private: int int_state;公众:加法器();Int add_one(Int increment);int get_val ();};

遗留源代码在文件中adder_cpp.h而且adder_cpp.cpp

% rtwdemo_sfun_adder_cppDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_adder_cpp”;def.StartFcnSpec =“createAdder()”;def.OutputFcnSpec ='int32 y1 = adderOutput(int32 u1)';def.TerminateFcnSpec =“deleteAdder()”;def.HeaderFiles = {“adder_cpp.h”};def.SourceFiles = {“adder_cpp.cpp”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};def.Options.language =“c++”;def.Options.useTlcWithAccel = false;

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_adder_cpp.cpp

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_adder_cpp mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228830/tp970cad4f/ex06428671', '-c', '-outdir', '/tmp/Bdoc19b_1305395_228830/tpfb239755_b0ed_4d6f_a849_b2a848a0e02c', '/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/adder_cpp.cpp')使用g++编译。MEX成功完成。mex(' rtwdemo_sfun_adder_cppp ', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228830/tp970cad4f/ex06428671', '-cxx', '/tmp/Bdoc19b_1305395_228830/tpfb239755_b0ed_4d6f_a849_b2a848a0e02c/adder_cpp.o')使用'g++'构建。MEX成功完成。###完成编译rtwdemo_sfun_adder_cpp ###退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code()。将第一个输入设置为“sfcn_tlc_generate”,以生成支持通过Simulink®Coder™进行代码生成的TLC块文件。金宝app金宝app如果没有创建TLC块文件,并且您试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_adder_cpp.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code()。设置第一个输入为'rtwmakecfg_generate'以生成rtwmakecfg。m文件,支持通过Simu金宝applink®Coder™生成代码。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code()。将第一个输入设置为'slblock_generate',以生成一个被配置为调用该S-function的屏蔽S-function块。软件将块放入一个新的模型中。您可以将该块复制到现有模型中。

% legacy_code('slblock_generate', def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_cpp显示与遗留代码的集成。

open_system (“rtwdemo_lct_cpp”) sim卡(“rtwdemo_lct_cpp”

集成将输入和输出实参作为参数传递给定点数据类型的外部C函数

使用遗留代码工具(legacy Code Tool)使用定点数据类型的参数来集成传递输入和输出的遗留C函数。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

(const myFixpt in1, const myFixpt in2, const uint8_T fracLength)

myFixpt逻辑上是一个定点数据类型,物理上是一个16位整数的类型定义:

myFixpt = 金宝appSimulink.NumericType;myFixpt。DataTypeMode =“定点:二进位点缩放”;myFixpt。Signed = true;myFixpt。WordLength = 16;myFixpt。FractionLength = 10;myFixpt。IsAlias= true; myFixpt.HeaderFile =“timesFixpt.h”

遗留源代码在文件中timesFixpt.h,timesS16.c

% rtwdemo_sfun_gain_fixptDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_gain_fixpt”;def.OutputFcnSpec ='myFixpt y1 = timesS16(myFixpt u1, myFixpt p1, uint8 p2)';def.HeaderFiles = {“timesFixpt.h”};def.SourceFiles = {“timesS16.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_gain_fixpt.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_gain_fixpt mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228687/tp9b66b501/ex05928773', '-c', '-outdir', '/tmp/Bdoc19b_1305395_228687/tp4248f61c_a1c3_4bed_99f7_3e72a599d69d', '/mathworks/dev /bat/Bdoc19b/build/matlab/ rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')MEX成功完成。mex('rtwdemo_sfun_gain_fixpt.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228687/tp9b66b501/ex05928773', '/tmp/Bdoc19b_1305395_228687/tp4248f61c_a1c3_4bed_99f7_3e72a599d69d/timesS16.o')使用'gcc'编译。MEX成功完成。###完成编译rtwdemo_sfun_gain_fixpt ###退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code()。设置第一个输入为“sfcn_tlc_generate”以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果您没有生成TLC块文件,并且试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_gain_fixpt.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code()。设置第一个输入为'rtwmakecfg_generate'以生成rtwmakecfg。支持代码生成的M文件。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code()。将第一个输入设置为'slblock_generate',以生成一个调用S-function的屏蔽S-function块。软件将块放入一个新的模型中。您可以将该块复制到现有模型中。

legacy_code (“slblock_generate”def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_fixpt_params显示模型与遗留代码的集成。子系统TestFixpt充当通过生成的s函数调用遗留C函数的工具。

open_system (“rtwdemo_lct_fixpt_params”) open_system (“rtwdemo_lct_fixpt_params / TestFixpt”) sim卡(“rtwdemo_lct_fixpt_params”

集成将输入和输出参数作为信号传递给定点数据类型的外部C函数

这个例子展示了如何使用遗留代码工具集成遗留C函数,这些函数通过使用定点数据类型的参数传递输入和输出。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

(const myFixpt in1, const myFixpt in2, const uint8_T fracLength)

myFixpt逻辑上是一个定点数据类型,物理上是一个16位整数的类型定义:

myFixpt = 金宝appSimulink.NumericType;myFixpt。DataTypeMode =“定点:二进位点缩放”;myFixpt。Signed = true;myFixpt。WordLength = 16;myFixpt。FractionLength = 10;myFixpt。IsAlias= true; myFixpt.HeaderFile =“timesFixpt.h”

遗留源代码在文件中timesFixpt.h,timesS16.c

% rtwdemo_sfun_times_s16Def = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_times_s16”;def.OutputFcnSpec ='myFixpt y1 = timesS16(myFixpt u1, myFixpt u2, uint8 p1)';def.HeaderFiles = {“timesFixpt.h”};def.SourceFiles = {“timesS16.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_times_s16.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_times_s16 mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229057/tp53128ecf/ex96454812', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229057/tp7559ed30_8836_44f7_9fad_e328cf684b2d', '/mathworks/devel/bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')MEX成功完成。mex('rtwdemo_sfun_times_s16.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229057/tp53128ecf/ex96454812', '/tmp/Bdoc19b_1305395_229057/tp7559ed30_8836_44f7_9fad_e328cf684b2d/timesS16.o')使用'gcc'编译。MEX成功完成。##完成编译rtwdemo_sfun_times_s16 ###退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果您没有生成TLC块文件,并且试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_times_s16.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为“slblock_generate”,以生成调用该S-function的屏蔽S-function块。软件将块放入一个新的模型中。从那里,您可以将它复制到一个现有的模型。

legacy_code (“slblock_generate”def);

展示模型与遗留代码的集成

该模型rtwdemo_lct_fixpt_signals显示模型与遗留代码的集成。子系统TestFixpt充当通过生成的s函数调用遗留C函数的工具。

open_system (“rtwdemo_lct_fixpt_signals”) open_system (“rtwdemo_lct_fixpt_signals / TestFixpt”) sim卡(“rtwdemo_lct_fixpt_signals”

将外部C函数与特定于实例的持久内存集成

通过使用遗留代码工具集成使用特定实例的持久内存的遗留C函数。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

void memory_bus_init(COUNTERBUS *mem, int32_T upper_sat, int32_T lower_sat);

void memory_bus_step(COUNTERBUS *input, COUNTERBUS *mem, COUNTERBUS *output);

Mem是一个特定于实例的持久内存,用于应用一个集成步骤延迟。中定义的结构类型定义counterbus.h并通过Simulink实现。金宝app公共汽车object in the base workspace. The legacy source code is in the filesmemory_bus.h,memory_bus.c

evalin (“基地”,“负载rtwdemo_lct_data.mat”% rtwdemo_sfun_workDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_work”;def.InitializeConditionsFcnSpec =...'void memory_bus_init(COUNTERBUS work1[1], int32 p1, int32 p2)';def.OutputFcnSpec =...'void memory_bus_step(COUNTERBUS u1[1], COUNTERBUS work1[1], COUNTERBUS y1[1])';def.HeaderFiles = {“memory_bus.h”};def.SourceFiles = {“memory_bus.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_work.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_work mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228588/ t53651845 /ex38707886', '-c', '-outdir', '/tmp/Bdoc19b_1305395_228588/tpdbef70da_68d3_4e08_af68_874bcef612eb', '/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/memory_bus.c')MEX成功完成。mex('rtwdemo_sfun_work.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228588/ t53651845 /ex38707886', '/tmp/Bdoc19b_1305395_228588/tpdbef70da_68d3_4e08_af68_874bcef612eb/memory_bus.o')使用'gcc'编译。MEX成功完成。##完成编译rtwdemo_sfun_work ##退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果您没有生成TLC块文件,并且试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_work.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为“slblock_generate”,以生成调用该S-function的屏蔽S-function块。软件将块放入一个新的模型中。从那里,您可以将它复制到一个现有的模型。

legacy_code (“slblock_generate”def);

展示模型与遗留代码的集成

该模型rtwdemo_lct_work显示模型与遗留代码的集成。子系统内存总线充当对遗留C函数的调用的工具。

open_system (“rtwdemo_lct_work”) open_system (“rtwdemo_lct_work / memory_bus”) sim卡(“rtwdemo_lct_work”

集成使用结构参数的外部C函数

使用遗留代码工具集成使用Simulink®总线的结构参数的遗留C函数。金宝app

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

counterbusFcn(COUNTERBUS *u1, int32_T u2, COUNTERBUS *y1, int32_T *y2)

中定义的结构类型定义counterbus.h并通过Simulink实现。金宝app公共汽车object in the base workspace. The legacy source code is in the filescounterbus.h,counterbus.c

evalin (“基地”,“负载rtwdemo_lct_data.mat”% rtwdemo_sfun_counterbusDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_counterbus”;def.OutputFcnSpec =...'void counterbusFcn(COUNTERBUS u1[1], int32 u2, COUNTERBUS y1[1], int32 y2[1])';def.HeaderFiles = {“counterbus.h”};def.SourceFiles = {“counterbus.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_counterbus.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_counterbus mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229057/tp53128ecf/ex90330074', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229057/tp35b0fe61_9e7a_4558_8694_61db6bc6bb41', '/mathworks/devel/bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/counterbus.c')MEX成功完成。mex('rtwdemo_sfun_counterbus.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229057/tp53128ecf/ex90330074', '/tmp/Bdoc19b_1305395_229057/tp35b0fe61_9e7a_4558_8694_61db6bc6bb41/counterbus.o')使用'gcc'编译。MEX成功完成。##完成编译rtwdemo_sfun_counterbus ###退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果您没有生成TLC块文件,并且试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_counterbus.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为“slblock_generate”,以生成调用该S-function的屏蔽S-function块。软件将块放入一个新的模型中。从那里,您可以将它复制到一个现有的模型。

legacy_code (“slblock_generate”def);

展示模型与遗留代码的集成

该模型rtwdemo_lct_bus显示模型与遗留代码的集成。子系统TestCounter充当对遗留C函数调用的工具。

open_system (“rtwdemo_lct_bus”) open_system (“rtwdemo_lct_bus / TestCounter”) sim卡(“rtwdemo_lct_bus”

集成将输入和输出参数作为复杂数据信号传递的外部C函数

使用复杂的信号和遗留代码工具集成遗留C函数。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

void cplx_gain(creal_T *输入,creal_T *增益,creal_T *输出);

creal_T是double的复数表示形式。遗留源代码在文件中cplxgain.h,cplxgain.c

% rtwdemo_sfun_gain_scalarDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_cplx_gain”;def.OutputFcnSpec =...'void cplx_gain(complex u1[1], '...'complex p1[1], complex y1[1])'];def.HeaderFiles = {“cplxgain.h”};def.SourceFiles = {“cplxgain.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_cplx_gain.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_cplx_gain mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229160/tp4d041e0e/ex97344681', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229160/tp710a721f_3302_4912_a4a0_dac85a15d7af', '/mathworks/devel/bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/cplxgain.c')MEX成功完成。mex('rtwdemo_sfun_cplx_gain.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229160/tp4d041e0e/ex97344681', '/tmp/Bdoc19b_1305395_229160/tp710a721f_3302_4912_a4a0_dac85a15d7af/cplxgain.o')使用'gcc'编译。MEX成功完成。##完成编译rtwdemo_sfun_cplx_gain ###退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果您没有生成TLC块文件,并且试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_cplx_gain.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为“slblock_generate”,以生成调用该S-function的屏蔽S-function块。软件将块放入一个新的模型中。从那里,您可以将它复制到一个现有的模型。

legacy_code (“slblock_generate”def);

展示模型与遗留代码的集成

该模型rtwdemo_lct_cplxgain显示模型与遗留代码的集成。子系统complex_gain充当通过generate s函数调用遗留C函数的工具。

如果isempty (find_system (“SearchDepth”0,“名字”,“rtwdemo_lct_cplxgain”) open_system (“rtwdemo_lct_cplxgain”) open_system (“rtwdemo_lct_cplxgain / complex_gain”) sim卡(“rtwdemo_lct_cplxgain”结束

集成传递继承维度参数的外部C函数

这个例子展示了如何使用遗留代码工具集成其参数具有继承维度的遗留C函数。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

  • void mat_add(real_T *u1, real_T *u2, int32_T n眉毛,int32_T nbCols, real_T *y1)

  • void mat_mult(real_T *u1, real_T *u2, int32_T nbrow1, int32_T nbcol1, int32_T nbcol2, real_T *y1)

real_T是double类型的类型定义,而int32_T是32位整数的类型定义。遗留源代码在文件中mat_ops.h,mat_ops.c

Defs = [];% rtwdemo_sfun_mat_addDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_mat_add”;def.OutputFcnSpec = ['void mat_add(double u1[][], double u2[][], '...'int32 u3, int32 u4, double y1[size(u1,1)][size(u1,2)])'];def.HeaderFiles = {“mat_ops.h”};def.SourceFiles = {“mat_ops.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};Defs = [Defs;def);% rtwdemo_sfun_mat_multDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_mat_mult”;def.OutputFcnSpec = ['void mat_mult(double u1[p1][p2], double u2[p2][p3], '...'int32 p1, int32 p2, int32 p3, double y1[p1][p3])'];def.HeaderFiles = {“mat_ops.h”};def.SourceFiles = {“mat_ops.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};Defs = [Defs;def);

生成模拟s函数

要根据输入参数“defs”提供的描述生成C-MEX s -函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_mat_add.c而且rtwdemo_sfun_mat_mult.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的模拟s函数

生成C-MEX S-function源文件后,要编译用于Simulink®仿真的S-function,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_mat_add mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229160/tp4d041e0e/ex89794148', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229160/tpc908a6f4_cf94_4ad0_b420_504b5681b10b', '/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')MEX成功完成。mex('rtwdemo_sfun_mat_add.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229160/tp4d041e0e/ex89794148', '/tmp/Bdoc19b_1305395_229160/tpc908a6f4_cf94_4ad0_b420_504b5681b10b/mat_ops.o')使用'gcc'编译。MEX成功完成。##退出##开始编译rtwdemo_sfun_mat_mult mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229160/tp4d041e0e/ex89794148', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229160/ t5a71ecc8_401a_48d4_bd9e_ebad96dd17e6 ', '/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')MEX成功完成。mex('rtwdemo_sfun_mat_mult.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229160/tp4d041e0e/ex89794148', '/tmp/Bdoc19b_1305395_229160/tp5a71ecc8_401a_48d4_bd9e_ebad96dd17e6/ mat_options .o')使用'gcc'编译。MEX成功完成。###完成编译rtwdemo_sfun_mat_mult ###退出

为代码生成生成TLC块文件

编译s -函数并在模拟中使用它们之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果不生成TLC块文件,并且试图为包含s函数的模型生成代码,则代码生成失败。s -函数的TLC块文件是rtwdemo_sfun_mat_add.tlc而且rtwdemo_sfun_mat_mult.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果S-functions所需的源文件和头文件与S-functions不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成屏蔽s函数块,用于调用生成的s函数

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为'slblock_generate',以生成调用S-function的屏蔽S-function块。该软件将这些块放入一个新的模型中。从那里,您可以将它们复制到现有的模型中

legacy_code (“slblock_generate”def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_inherit_dims显示模型与遗留代码的集成。子系统TestMatOps用作对遗留C函数的调用的集合,单元延迟用于存储以前的输出值。

open_system (“rtwdemo_lct_inherit_dims”) open_system (“rtwdemo_lct_inherit_dims / TestMatOps”) sim卡(“rtwdemo_lct_inherit_dims”

集成将参数作为多维信号传递的外部C函数

这个例子展示了如何使用遗留代码工具将遗留C函数与多维信号集成在一起。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

void array3d_add(real_T *y1, real_T *u1, real_T *u2, int32_T n眉头,int32_T nbCols, int32_T nbPages);

real_T是double类型的类型定义,而int32_T是32位整数的类型定义。遗留源代码在文件中ndarray_ops.h,ndarray_ops.c

% rtwdemo_sfun_ndarray_addDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_ndarray_add”;def.OutputFcnSpec =...空白array3d_add(双y₁[大小(u1, 1)][大小(u1, 2)][大小(u1, 3)],”,...'双u1[][][],双u2[][][], '...'int32 size(u1,1), int32 size(u1,2), int32 size(u1,3))'];def.HeaderFiles = {“ndarray_ops.h”};def.SourceFiles = {“ndarray_ops.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};

y1是一个三维输出信号,其尺寸与三维输入信号u1相同。注意,传递给遗留函数的最后3个参数对应于3- d输入信号u1中每个维度的元素数量。

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_ndarray_add.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_ndarray_add mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229660/tp40312e5c/ex14927435', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229660/tp4346ffda_939e_4185_9e85_50e6fa1cfc8d', '/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ndarray_ops.c')MEX成功完成。mex('rtwdemo_sfun_ndarray_add.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229660/tp40312e5c/ex14927435', '/tmp/Bdoc19b_1305395_229660/tp4346ffda_939e_4185_9e85_50e6fa1cfc8d/ndarray_ops.o')使用'gcc'编译。MEX成功完成。###完成编译rtwdemo_sfun_ndarray_add ###退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果您没有生成TLC块文件,并且试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_ndarray_add.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为“slblock_generate”,以生成调用该S-function的屏蔽S-function块。软件将块放入一个新的模型中。从那里,您可以将它复制到一个现有的模型。

legacy_code (“slblock_generate”def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_ndarray显示模型与遗留代码的集成。子系统ndarray_add作为对遗留C函数调用的一个工具。

open_system (“rtwdemo_lct_ndarray”) open_system (“rtwdemo_lct_ndarray / ndarray_add”) sim卡(“rtwdemo_lct_ndarray”

集成实现启动和终止操作的外部C函数

通过使用遗留代码工具集成具有启动和终止操作的遗留C函数。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

  • void initFaultCounter(无符号int *计数器)

  • (void **fid)

  • void *fid, unsigned int *counter, double time

  • void **fid (void **fid)

遗留源代码在文件中your_types.h,fault.h,fault.c

% rtwdemo_sfun_faultDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_fault”;def.InitializeConditionsFcnSpec =“initFaultCounter (uint32 work2[1])”;def.StartFcnSpec =“openLogFile (void * * work1)”;def.OutputFcnSpec =...'incAndLogFaultCounter(void *work1, uint32 work2[1], double u1)';def.TerminateFcnSpec =“closeLogFile (void * * work1)”;def.HeaderFiles = {“fault.h”};def.SourceFiles = {“fault.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};def.Options.useTlcWithAccel = false;

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_fault.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_fault mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229314/tpd784f5ed/ex46254423', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229314/tp7808a25d_8653_4bf0_b5ad_f799e2925fed', '/mathworks/devel/bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/fault.c')MEX成功完成。mex(' rtwdemo_sfun_error .c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229314/tpd784f5ed/ex46254423', '/tmp/Bdoc19b_1305395_229314/tp7808a25d_8653_4bf0_b5ad_f799e2925fed/ error .o')使用'gcc'编译。MEX成功完成。##完成编译rtwdemo_sfun_fault ###退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果您没有生成TLC块文件,并且试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_fault.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为“slblock_generate”,以生成调用该S-function的屏蔽S-function块。软件将块放入一个新的模型中。从那里,您可以将它复制到一个现有的模型。

legacy_code (“slblock_generate”def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_start_term显示模型与遗留代码的集成。子系统TestFixpt作为对遗留C函数的调用的集合,作用域将函数的输出与内置Simulink®产品块的输出进行比较;金宝app结果应该是一样的。

open_system (“rtwdemo_lct_start_term”) open_system (“rtwdemo_lct_start_term / TestFault”) sim卡(“rtwdemo_lct_start_term”

集成实现n维表查找的外部C函数

通过使用遗留代码工具集成实现n维表查找的遗留C函数。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

FLT directLookupTableND(const FLT *tableND, const UINT32 nbDims, const UINT32 *tableDims, const UINT32 *tableIdx)

FLT是float的类型定义,而UINT32是unsigned int32的类型定义。遗留源代码在文件中your_types.h,lookupTable.h,directLookupTableND.c

Defs = [];evalin (“基地”,“负载rtwdemo_lct_data.mat”% rtwdemo_sfun_dlut3DDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_dlut3D”;def.OutputFcnSpec ='single y1 = DirectLookupTable3D(single p1[][][], uint32 p2[3], uint32 u1[3])';def.HeaderFiles = {“lookupTable.h”};def.SourceFiles = {“directLookupTableND.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};Defs = [Defs;def);% rtwdemo_sfun_dlut4DDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_dlut4D”;def.OutputFcnSpec ='single y1 = DirectLookupTable4D(single p1[][][][] [], uint32 p2[4], uint32 u1[4])';def.HeaderFiles = {“lookupTable.h”};def.SourceFiles = {“directLookupTableND.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};Defs = [Defs;def);

生成模拟s函数

要根据输入参数“defs”提供的描述生成C-MEX s函数,请再次调用函数legacy_code()。将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_dlut3D.c而且rtwdemo_sfun_dlut4D.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的模拟s函数

生成C-MEX S-function源文件后,要编译用于Simulink®仿真的S-function,请再次调用函数legacy_code()。金宝app将第一个输入设置为“compile”。

legacy_code (“编译”def);
开始编译rtwdemo_sfun_dlut3D mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229057/tp53128ecf/ex19426386', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229057/tpe2965106_b971_4ebe_bbac_9754e78d0ea7', '/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/directLookupTableND.c')MEX成功完成。mex(' rtwdemo_sfun_dlut3dc ', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229057/tp53128ecf/ex19426386', '/tmp/Bdoc19b_1305395_229057/tpe2965106_b971_4ebe_bbac_9754e78d0ea7/directLookupTableND.o')使用'gcc'编译。MEX成功完成。##退出###开始编译rtwdemo_sfun_dlut4D mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229057/tp53128ecf/ex19426386', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229057/tp769974c4_7412_4686_b402_ce5e40f7b875', '/mathworks/devel/bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/directLookupTableND.c')MEX成功完成。mex(' rtwdemo_sfun_dlut4dc ', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229057/tp53128ecf/ex19426386', '/tmp/Bdoc19b_1305395_229057/tp769974c4_7412_4686_b402_ce5e40f7b875/directLookupTableND.o')使用'gcc'编译。MEX成功完成。###完成编译rtwdemo_sfun_dlut4D ###退出

为代码生成生成TLC块文件

编译s函数并在模拟中使用它们之后,可以再次调用函数legacy_code()。设置第一个输入为“sfcn_tlc_generate”以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果不生成TLC块文件,并且试图为包含s函数的模型生成代码,则代码生成失败。s -函数的TLC块文件是rtwdemo_sfun_dlut3D.tlc而且rtwdemo_sfun_dlut4D.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code()。设置第一个输入为'rtwmakecfg_generate'以生成rtwmakecfg。M文件支持代码生成。金宝app如果S-functions所需的源文件和头文件与S-functions不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成屏蔽s函数块,用于调用生成的s函数

编译C-MEX S-function源代码后,可以再次调用函数legacy_code()。将第一个输入设置为'slblock_generate',以生成调用S-function的屏蔽S-function块。该软件将这些块放入一个新的模型中。您可以将这些块复制到现有的模型中。

legacy_code (“slblock_generate”def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_lut显示模型与遗留代码的集成。子系统TestFixpt用作对遗留C函数的调用的集合,Display块将函数的输出与内置的Simulink®查找块的输出进行比较。金宝app结果是一样的。

open_system (“rtwdemo_lct_lut”) open_system (“rtwdemo_lct_lut / TestLut1”) sim卡(“rtwdemo_lct_lut”

集成将参数作为多维信号传递的外部C函数

这个例子展示了如何使用遗留代码工具将遗留C函数与多维信号集成在一起。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

void array3d_add(real_T *y1, real_T *u1, real_T *u2, int32_T n眉头,int32_T nbCols, int32_T nbPages);

real_T是double类型的类型定义,而int32_T是32位整数的类型定义。遗留源代码在文件中ndarray_ops.h,ndarray_ops.c

% rtwdemo_sfun_ndarray_addDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_ndarray_add”;def.OutputFcnSpec =...空白array3d_add(双y₁[大小(u1, 1)][大小(u1, 2)][大小(u1, 3)],”,...'双u1[][][],双u2[][][], '...'int32 size(u1,1), int32 size(u1,2), int32 size(u1,3))'];def.HeaderFiles = {“ndarray_ops.h”};def.SourceFiles = {“ndarray_ops.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};

y1是一个三维输出信号,其尺寸与三维输入信号u1相同。注意,传递给遗留函数的最后3个参数对应于3- d输入信号u1中每个维度的元素数量。

生成模拟的s函数

要根据输入参数“def”提供的描述生成C-MEX s函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_ndarray_add.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的s函数用于仿真

生成C-MEX S-function源文件后,要用Simulink®编译S-function进行仿真,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_ndarray_add mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229660/tp40312e5c/ex14927435', '-c', '-outdir', '/tmp/Bdoc19b_1305395_229660/tp4346ffda_939e_4185_9e85_50e6fa1cfc8d', '/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ndarray_ops.c')MEX成功完成。mex('rtwdemo_sfun_ndarray_add.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_229660/tp40312e5c/ex14927435', '/tmp/Bdoc19b_1305395_229660/tp4346ffda_939e_4185_9e85_50e6fa1cfc8d/ndarray_ops.o')使用'gcc'编译。MEX成功完成。###完成编译rtwdemo_sfun_ndarray_add ###退出

为代码生成生成一个TLC块文件

编译s函数并在模拟中使用它之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果您没有生成TLC块文件,并且试图为包含s函数的模型生成代码,那么代码生成将失败。s函数的TLC块文件是:rtwdemo_sfun_ndarray_add.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果s -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成一个屏蔽S-Function块,用于调用生成的S-Function

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为“slblock_generate”,以生成调用该S-function的屏蔽S-function块。软件将块放入一个新的模型中。从那里,您可以将它复制到一个现有的模型。

legacy_code (“slblock_generate”def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_ndarray显示模型与遗留代码的集成。子系统ndarray_add作为对遗留C函数调用的一个工具。

open_system (“rtwdemo_lct_ndarray”) open_system (“rtwdemo_lct_ndarray / ndarray_add”) sim卡(“rtwdemo_lct_ndarray”

使用指定的、继承的和参数化的块采样时间集成外部C函数

这个例子展示了如何使用遗留代码工具(Legacy Code Tool)将遗留C函数与指定、继承和参数化的块样例时间集成在一起。

使用遗留代码工具,您可以:

  • 提供遗留函数规范。

  • 生成一个C-MEX s函数,在模拟过程中调用遗留代码。

  • 编译并构建生成的s函数进行仿真。

  • 生成TLC块文件和可选rtwmakecfg。M文件,该文件指定为模型生成的代码如何调用遗留代码。

提供遗留函数规范

遗留代码工具函数以特定的数据结构或结构数组作为参数。通过使用'initialize'作为第一个输入调用函数legacy_code(),可以初始化数据结构。在初始化结构之后,将其属性分配给与集成的遗留代码相对应的值。有关属性的详细帮助,请调用legacy_code(“帮助”).本例中调用的遗留函数的原型是:

FLT增益标量(const FLT in, const FLT gain)

FLT是float的类型定义。遗留源代码在文件中your_types.h,gain.h,gainScalar.c

Defs = [];% rtwdemo_sfun_st_inheritedDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_st_inherited”;def.OutputFcnSpec ='单个y1 = gainScalar(单个u1,单个p1)';def.HeaderFiles = {“gain.h”};def.SourceFiles = {“gainScalar.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};Defs = [Defs;def);% rtwdemo_sfun_st_fixedDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_st_fixed”;def.OutputFcnSpec ='单个y1 = gainScalar(单个u1,单个p1)';def.HeaderFiles = {“gain.h”};def.SourceFiles = {“gainScalar.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};def.SampleTime = [2 1];Defs = [Defs;def);% rtwdemo_sfun_st_parameterizedDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_st_parameterized”;def.OutputFcnSpec ='单个y1 = gainScalar(单个u1,单个p1)';def.HeaderFiles = {“gain.h”};def.SourceFiles = {“gainScalar.c”};def.IncPaths = {“rtwdemo_lct_src”};def.SrcPaths = {“rtwdemo_lct_src”};def.SampleTime =“参数化”;Defs = [Defs;def);

生成模拟s函数

要根据输入参数“defs”提供的描述生成C-MEX s -函数,请再次调用函数legacy_code(),并将第一个输入设置为“sfcn_cmex_generate”。s函数在模拟期间调用遗留函数。s函数的源代码在文件中rtwdemo_sfun_st_inherited.c而且rtwdemo_sfun_st_fixed.crtwdemo_sfun_st_parameterized.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的模拟s函数

生成C-MEX S-function源文件后,要编译用于Simulink®仿真的S-function,请再次调用函数legacy_code(),并将第一个输入设置为“compile”。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_st_inherited mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228588/tp53651845/ex74504488', '-c', '-outdir', '/tmp/Bdoc19b_1305395_228588/tp859b14cc_fd3a_4287_95e1_a4dac6ae4391', '/mathworks/devel/bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ gainscala .c')MEX成功完成。mex(' rtwdemo_sfun_st_inherede .c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228588/tp53651845/ex74504488', '/tmp/Bdoc19b_1305395_228588/tp859b14cc_fd3a_4287_95e1_a4dac6ae4391/ gainscala .o')使用'gcc'编译。MEX成功完成。## Exit ###开始编译rtwdemo_sfun_st_fixed mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228588/ t53651845 /ex74504488', '-c', '-outdir', '/tmp/Bdoc19b_1305395_228588/tpb4df984e_510b_40a5_a1c1_5a4ca961c6c1', '/mathworks/devel/bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c')MEX成功完成。mex('rtwdemo_sfun_st_fixed.c', '-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228588/tp53651845/ex74504488', '/tmp/Bdoc19b_1305395_228588/tpb4df984e_510b_40a5_a1c1_5a4ca961c6c1/ gainscala .o')使用'gcc'编译。MEX成功完成。开始编译rtwdemo_sfun_st_parameterized mex('-I/mathworks/dev /bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228588/tp53651845/ex74504488', '-c', '-outdir', '/tmp/Bdoc19b_1305395_228588/tp318c4265_605a_46a3_a698_fc9afa7f73c2', '/mathworks/devel/bat/Bdoc19b/build/matlab/ rtw/rtwdemos/rtwdemo_lct_src/ gainscala .c')MEX成功完成。 mex('rtwdemo_sfun_st_parameterized.c', '-I/mathworks/devel/bat/Bdoc19b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc19b_1305395_228588/tp53651845/ex74504488', '/tmp/Bdoc19b_1305395_228588/tp318c4265_605a_46a3_a698_fc9afa7f73c2/gainScalar.o') Building with 'gcc'. MEX completed successfully. ### Finish Compiling rtwdemo_sfun_st_parameterized ### Exit

为代码生成生成TLC块文件

编译s -函数并在模拟中使用它们之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果不生成TLC块文件,并且试图为包含s函数的模型生成代码,则代码生成失败。s -函数的TLC块文件是rtwdemo_sfun_st_inherited.tlc而且rtwdemo_sfun_st_fixed.tlcrtwdemo_sfun_st_parameterized.tlc

legacy_code (“sfcn_tlc_generate”def);

生成rtwmakecfg。m代码生成文件

创建TLC块文件后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成rtwmakecfg。M文件支持代码生成。金宝app如果S-functions所需的源文件和头文件与S-functions不在同一个文件夹中,并且您希望在代码生成过程中生成的makefile中添加这些依赖项,请生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

生成屏蔽s函数块,用于调用生成的s函数

编译C-MEX S-function源代码后,可以再次调用函数legacy_code(),并将第一个输入设置为'slblock_generate',以生成调用S-function的屏蔽S-function块。该软件将这些块放入一个新的模型中。从那里,您可以将它们复制到现有的模型中。

legacy_code (“slblock_generate”def);

显示使用遗留代码生成的集成

该模型rtwdemo_lct_sampletime显示模型与遗留代码的集成。子系统sample_time用作对遗留C函数的调用的控制,使用单元延迟存储以前的输出值。

open_system (“rtwdemo_lct_sampletime”) open_system (“rtwdemo_lct_sampletime / sample_time”) sim卡(“rtwdemo_lct_sampletime”

另请参阅

相关的话题