主要内容

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

遗留代码工具和代码生成

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

请注意

遗留代码工具可以与c++函数交互,但不能与c++对象交互。要解决此问题,以便该工具可以与c++对象进行接口,请参见遗留代码工具限制

您可以使用该工具:

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

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

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

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

有关更多信息,请参见使用遗留代码工具集成C函数

生成代码生成的内联s函数文件

根据应用程序的代码生成需求,要为使用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”必须对所有注册文件通用。有关更多信息,请参见处理多个注册文件

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

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

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

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

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

  • 注册文件

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

  • TLC块文件

  • sFunction_makecfg.mrtwmakecfg.m文件

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

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

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

  • 如果遗留代码工具数据结构将所需的文件注册为绝对路径,并且文件的位置发生更改,则重新生成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) =新加器#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加器::add_one(int增量){int_state +=增量;返回int_state;}
  • 更新rtwdemo_sfun_adder_cpp.cpp改动如下:

    • StartFcnSpec调用分配new加法器对象并缓存指针。

      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 signal, const FLT prevSignal, const FLT gain)

  • FLT filterV2(const FLT* signal, const FLT prevSignal, const FLT gain)

FLT是float的类型定义。遗留源代码在文件中your_types.hmyfilter.hfilterV1.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.crtwdemo_sfun_filterV2.c

legacy_code (“sfcn_cmex_generate”def);

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

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

legacy_code (“编译”def);
开始编译rtwdemo_sfun_filterV1 mex('-I/mathworks/dev /bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex19632214', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tp2d7c0548_8e2e_4033_8637_0803e2037d31', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/filterV1.c')MEX完成成功。mex('rtwdemo_sfun_filterV1.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex19632214', '/tmp/Bdoc20b_1498024_23683/tp2d7c0548_8e2e_4033_8637_0803e2037d31/filterV1.o')使用'gcc'构建。MEX完成成功。开始编译rtwdemo_sfun_filterV2 mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex19632214', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tpdc11e5cd_f20b_4c64_abfd_d91ca062401e', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/filterV2.c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_filterV2.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex19632214', '/tmp/Bdoc20b_1498024_23683/tpdc11e5cd_f20b_4c64_abfd_d91ca062401e/filterV2.o')使用'gcc'构建。MEX完成成功。完成rtwdemo_sfun_filterV2的编译

为代码生成生成TLC块文件

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

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

legacy_code (“slblock_generate”def);

显示与遗留代码生成的集成

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

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

集成外部C函数,将输出参数作为返回参数传递

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

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

  • 提供遗留功能规范。

  • 生成在模拟期间调用遗留代码的C-MEX s函数。

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

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

提供遗留功能规范

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

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

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

% rtwdemo_sfun_gain_scalarDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_gain_scalar”;def.OutputFcnSpec ='single y1 = gainScalar(single u1, single 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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_gain_scalar mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex09148220', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tpe20ae13a_a0e9_4278_bc95_c0b5f88b483f', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ gainscala .c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_gain_scala .c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex09148220', '/tmp/Bdoc20b_1498024_23683/tpe20ae13a_a0e9_4278_bc95_c0b5f88b483f/ 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函数块,用于调用生成的s函数

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

legacy_code (“slblock_generate”def);

显示与遗留代码生成的集成

该模型rtwdemo_lct_gain显示模型与遗留代码的集成。子系统TestGain充当了通过生成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.hadder_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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_adder_cpp mex('-I/mathworks/dev /bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23226/tp09ae4b46/ex06428671', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23226/tp23b63aff_fcdd_4db2_89a7_406ab6866f9f', '/mathworks/dev /bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ adder_cppp .cpp')用g++'构建。MEX完成成功。mex(' rtwdemo_sfun_adder_cppp .cpp', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23226/tp09ae4b46/ex06428671', '-cxx', '/tmp/Bdoc20b_1498024_23226/tp23b63aff_fcdd_4db2_89a7_406ab6866f9f/ 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函数块,用于调用生成的s函数

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

% 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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_gain_fixpt mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex05928773', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tpbe4708cf_8b79_47d1_8e0b_911474d1ab26', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_gain_fixpt.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex05928773', '/tmp/Bdoc20b_1498024_23683/tpbe4708cf_8b79_47d1_8e0b_911474d1ab26/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函数块,用于调用生成的s函数

编译C-MEX s -函数源代码后,可以再次调用函数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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_times_s16 mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex96454812', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tp28f1ebbf_623b_41c6_a686_a6403d733074', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')使用'gcc'构建。MEX完成成功。('rtwdemo_sfun_times_s16.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex96454812', '/tmp/Bdoc20b_1498024_23683/tp28f1ebbf_623b_41c6_a686_a6403d733074/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函数块,用于调用生成的s函数

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

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 *输入,COUNTERBUS *mem, COUNTERBUS *输出);

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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_work mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex38707886', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tpc3d8248e_6482_4358_8eb3_3ea61d1bec16', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/memory_bus.c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_work.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex38707886', '/tmp/Bdoc20b_1498024_23683/tpc3d8248e_6482_4358_8eb3_3ea61d1bec16/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函数块,用于调用生成的s函数

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

legacy_code (“slblock_generate”def);

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

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

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

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

将使用Simulink®总线的结构参数与遗留代码工具集成在一起。金宝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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_counterbus mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex90330074', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tp283485e5_48ca_448f_97b0_3ebd3d3d9e80', '/mathworks/devel/bat/Bdoc20b/build/matlab/工具箱/rtw/rtwdemos/rtwdemo_lct_src/counterbus.c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_counterbus.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex90330074', '/tmp/Bdoc20b_1498024_23683/tp283485e5_48ca_448f_97b0_3ebd3d3d9e80/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函数块,用于调用生成的s函数

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

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 *input, creal_T *gain, creal_T *output);

creal_T是双精度对象的复数表示。遗留源代码在文件中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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_cplx_gain mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex97344681', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tp3cb44596_592c_4efe_8d49_e3360d80b84a', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/cplxgain.c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_cplx_gain.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex97344681', '/tmp/Bdoc20b_1498024_23683/tp3cb44596_592c_4efe_8d49_e3360d80b84a/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函数块,用于调用生成的s函数

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

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 nbRows1, int32_T nbCols1, int32_T nbCols2, 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,双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.crtwdemo_sfun_mat_mult.c

legacy_code (“sfcn_cmex_generate”def);

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

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

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_mat_add mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex89794148', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tp0714fa52_bae8_41a5_92ff_f721d9ddc7ad', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_mat_add.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex89794148', '/tmp/Bdoc20b_1498024_23683/tp0714fa52_bae8_41a5_92ff_f721d9ddc7ad/mat_ops.o')使用'gcc'构建。MEX完成成功。开始编译rtwdemo_sfun_mat_mult mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex89794148', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tp96d09bb8_aa72_4263_893d_63ff9de79c8f', '/mathworks/devel/bat/Bdoc20b/build/matlab/工具箱/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_mat_mult.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex89794148', '/tmp/Bdoc20b_1498024_23683/tp96d09bb8_aa72_4263_893d_63ff9de79c8f/mat_ops.o')使用'gcc'构建。MEX完成成功。完成rtwdemo_sfun_mat_mult的编译

为代码生成生成TLC块文件

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

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

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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_ndarray_add mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex14927435', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23832/tpa9b8f9c1_a00c_41b1_89e3_f13c7c83798b', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ndarray_ops.c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_ndarray_add.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex14927435', '/tmp/Bdoc20b_1498024_23832/tpa9b8f9c1_a00c_41b1_89e3_f13c7c83798b/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函数块,用于调用生成的s函数

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

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(unsigned int *counter)

  • void openLogFile(void **fid)

  • void incAndLogFaultCounter(void *fid, unsigned int *counter, double time)

  • void closeLogFile(void **fid)

遗留源代码在文件中your_types.hfault.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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
开始编译rtwdemo_sfun_fault mex('-I/mathworks/dev /bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex46254423', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23832/tpfb218f92_5d74_4e41_b559_823d6ec5c3d2', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/fault.c')MEX完成成功。mex(' rtwdemo_sfun_error .c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex46254423', '/tmp/Bdoc20b_1498024_23832/tpfb218f92_5d74_4e41_b559_823d6ec5c3d2/fault.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函数块,用于调用生成的s函数

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

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.hlookupTable.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.crtwdemo_sfun_dlut4D.c

legacy_code (“sfcn_cmex_generate”def);

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

生成C-MEX s -函数源文件后,要编译s -函数以使用Simulink®进行模拟,请再次调用函数legacy_code()。金宝app将第一个输入设置为'compile'。

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_dlut3D mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex19426386', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23832/tp4e403b41_3480_43ed_ba92_49f98b2196a4', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ directlookuptablendt .c')使用'gcc'构建。MEX完成成功。mex(' rtwdemo_sfun_dlut3dc ', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex19426386', '/tmp/Bdoc20b_1498024_23832/tp4e403b41_3480_43ed_ba92_49f98b2196a4/directLookupTableND.o')使用'gcc'构建。MEX完成成功。开始编译rtwdemo_sfun_dlut4D mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex19426386', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23832/tp785ec269_b6a1_4013_b0f9_f9db4487a058', '/mathworks/devel/bat/Bdoc20b/build/matlab/工具箱/rtw/rtwdemos/rtwdemo_lct_src/directLookupTableND.c')使用'gcc'构建。MEX完成成功。mex(' rtwdemo_sfun_dlut4dc ', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex19426386', '/tmp/Bdoc20b_1498024_23832/tp785ec269_b6a1_4013_b0f9_f9db4487a058/directLookupTableND.o')使用'gcc'构建。MEX完成成功。完成rtwdemo_sfun_dlut4D的编译

为代码生成生成TLC块文件

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

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

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源文件后,要编译S-function以使用Simulink®进行模拟,请再次调用函数legacy_code(),并将第一个输入设置为'compile'。金宝app

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_ndarray_add mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex14927435', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23832/tpa9b8f9c1_a00c_41b1_89e3_f13c7c83798b', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ndarray_ops.c')使用'gcc'构建。MEX完成成功。mex('rtwdemo_sfun_ndarray_add.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23832/tpfd38380f/ex14927435', '/tmp/Bdoc20b_1498024_23832/tpa9b8f9c1_a00c_41b1_89e3_f13c7c83798b/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函数块,用于调用生成的s函数

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

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(“帮助”).在这个例子中被调用的遗留函数的原型是:

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

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

Defs = [];% rtwdemo_sfun_st_inheritedDef = legacy_code(“初始化”);def.SFunctionName =“rtwdemo_sfun_st_inherited”;def.OutputFcnSpec ='single y1 = gainScalar(single u1, single 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 ='single y1 = gainScalar(single u1, single 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 ='single y1 = gainScalar(single u1, single 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.crtwdemo_sfun_st_fixed.crtwdemo_sfun_st_parameterized.c

legacy_code (“sfcn_cmex_generate”def);

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

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

legacy_code (“编译”def);
###开始编译rtwdemo_sfun_st_inherited mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex74504488', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tpa8226174_34f4_4e1a_bcd5_7c1fc5c32d00', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ gainscala .c')使用'gcc'构建。MEX完成成功。/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex74504488', /tmp/Bdoc20b_1498024_23683/tpa8226174_34f4_4e1a_bcd5_7c1fc5c32d00/ gainscala .o')使用“gcc”构建。MEX完成成功。## Exit ###开始编译rtwdemo_sfun_st_fixed mex('-I/mathworks/dev /bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex74504488', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tpaae5a6f9_ced2_435a_bb48_6e5cf922c677', '/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ gainscala .c')使用'gcc'编译。MEX完成成功。mex(' rtwdemo_sfun_st_fixedc ', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex74504488', '/tmp/Bdoc20b_1498024_23683/tpaae5a6f9_ced2_435a_bb48_6e5cf922c677/ gainscala .o')使用'gcc'构建。MEX完成成功。开始编译rtwdemo_sfun_st_parameterized mex('-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex74504488', '-c', '-outdir', '/tmp/Bdoc20b_1498024_23683/tpf7296362_025a_4b60_bf29_c5499e7f1718', '/mathworks/devel/bat/Bdoc20b/build/matlab/工具箱/rtw/rtwdemos/rtwdemo_lct_src/ gainscala .c')使用'gcc'构建。MEX完成成功。 mex('rtwdemo_sfun_st_parameterized.c', '-I/mathworks/devel/bat/Bdoc20b/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc20b_1498024_23683/tp3ad1696b/ex74504488', '/tmp/Bdoc20b_1498024_23683/tpf7296362_025a_4b60_bf29_c5499e7f1718/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.tlcrtwdemo_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 -函数所需的源文件和头文件与s -函数不在同一个文件夹中,并且希望在代码生成期间生成的makefile中添加这些依赖项,则生成rtwmakecfg。m文件。

legacy_code (“rtwmakecfg_generate”def);

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

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

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”

另请参阅

相关的话题