文档

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

遗留代码工具和代码生成

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

请注意

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

您可以使用该工具:

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

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

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

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

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

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

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

  • 生成一个. 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对象之一万博1manbetxIsAlias属性设置为真正的

    • 万博1manbetx仿真软件。公共汽车

    • 万博1manbetx仿真软件。AliasType

    • 万博1manbetx仿真软件。NumericType

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

  • HeaderFiles字段指定多个头文件

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

要将代码风格的模型配置参数应用到遗留函数:

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

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

    def.Options.singleCPPMexFile = true;

查看设置,输入:

def.Options.singleCPPMexFile

singleCPPMexFile局限性

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

  • Options.language =“c++”

  • 控件中使用下列Simulink对象之一万博1manbetxIsAlias属性设置为真正的

    • 万博1manbetx仿真软件。公共汽车

    • 万博1manbetx仿真软件。AliasType

    • 万博1manbetx仿真软件。NumericType

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

  • HeaderFiles字段指定多个头文件

解决文件在不同位置的依赖关系

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

生成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”所有注册文件必须是共同的。有关更多信息,请参见处理多个注册文件(万博1manbetx模型)。

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

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

有关更多信息,请参见建立对s功能万博1manbetx的支持

为仿真和代码生成部署s -函数

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

  • 注册文件

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

  • TLC块文件

  • sFunction_makecfg.mrtwmakecfg.m文件

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

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

  • 在使用Simulink模型中部署的文件之前,将包含S-function文件万博1manbetx的文件夹添加到MATLAB中®路径。

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

集成外部c++对象方法

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

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

  • 提供遗留功能规范。

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

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

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

提供遗留功能规范

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

Class adder {private: int int_state;公众:加法器();int add_one (int增量);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 -函数源文件后,要用Simulink®编译用于仿真的s -函数,使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
# # #开始编译rtwdemo_sfun_adder_cpp墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_55302 / tpb5f27a0b / ex06428671 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_55302 / tp9400f4fe_be5f_4c06_886a_6a8fa87b86b1 ','/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/adder_cpp.cpp')使用'g++'构建。墨西哥人成功完成。/tmp/Bdoc18a_827493_55302/tpb5f27a0b/ex06428671', '-cxx', '/tmp/Bdoc18a_827493_55302/tp9400f4fe_be5f_4c06_886a_6a8fa87b86b1/ adder_cpp.cpp')使用'g++'构建。墨西哥人成功完成。###完成rtwdemo_sfun_adder_cpp的编译

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

编译S函数并在模拟中使用后,可以再次调用函数legacy_code()。将第一个输入设置为“sfcn\u tlc\u generate”,以生成支持通过Simulink®编码器生成代码的tlc块文件™. 如果未创建TLC块文件,并且您尝试为包含S函数的模型生成代码,则代码生成失败。S功能的TLC块文件为:万博1manbetx万博1manbetxrtwdemo_sfun_adder_cpp.tlc

legacy_code (“sfcn_tlc_generate”def);

生成一个rtwmakecfg。m用于代码生成的文件

创建TLC块文件之后,可以再次调用函数legacy_code()。将第一个输入设置为'rtwmakecfg_generate'以生成rtwmakecfg。m文件,支持通过Simu万博1manbetxlink®Coder™生成代码。万博1manbetx如果S-function所需的源文件和头文件不在与S-function相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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_cpp显示与遗留代码的集成。

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

集成外部c++对象

遗留代码工具可以与c++函数交互,但不能与c++对象交互。以前面的示例为起点,下面是一个示例,说明如何克服这个限制。

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

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

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

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

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

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

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

遗留代码工具示例

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

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

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

  • 提供遗留功能规范。

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

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

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

提供遗留功能规范

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

  • FLT滤波v1 (const FLT信号,const FLT prevSignal, const FLT增益)

  • FLT filterV2(const FLT* signal, const FLT prevSignal, const FLT增益)

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

请注意这两个结构中OutputFcnSpec的区别;第一个case指定第一个输入参数通过值传递,而第二个case指定通过指针传递。

def = [];% 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”};def = [def;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”};def = [def;def);

为仿真生成s函数

要根据输入参数'defs'提供的描述生成C-MEX S-functions,请再次调用函数legacy_code(),并将第一个输入设置为'sfcn_cmex_generate'。s函数在仿真中调用传统函数。S-functions的源代码在文件中rtwdemo_sfun_filterV1.crtwdemo_sfun_filterV2.c

legacy_code (“sfcn_cmex_generate”def);

编译生成的仿真s函数

生成C-MEX s -函数源文件后,要用Simulink®编译用于仿真的s -函数,请使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
# # #开始编译rtwdemo_sfun_filterV1墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_68949 / tp37758421 / ex19632214 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_68949 / tp8a289518_0af0_4592_8207_badc3bae5406 ',“/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/filterV1.c”)使用“gcc”构建。墨西哥人成功完成。mex('rtwdemo_sfun_filterV1.c', '-I/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/ rtwdemo_lct_src', '-I/tmp/Bdoc18a_827493_68949/tp37758421/ex19632214', '/tmp/Bdoc18a_827493_68949/tp8a289518_0af0_4592_8207_badc3bae5406/filterV1.o')使用gcc构建。墨西哥人成功完成。# # #完成编译rtwdemo_sfun_filterV1退出# # # # # #开始编译rtwdemo_sfun_filterV2墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_68949 / tp37758421 / ex19632214 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_68949 / tp6016053f_ef0d_47ab_aec9_19bf9b8c9091 ',“/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/filterV2.c”)使用“gcc”构建。墨西哥人成功完成。/tmp/Bdoc18a_827493_68949/tp37758421/ex19632214', '/tmp/Bdoc18a_827493_68949/tp6016053f_ef0d_47ab_aec9_19bf9b8c9091/filterV2.o')使用“gcc”构建。墨西哥人成功完成。 ### Finish Compiling rtwdemo_sfun_filterV2 ### Exit

为代码生成生成TLC块文件

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

legacy_code (“sfcn_tlc_generate”def);

生成一个rtwmakecfg。m用于代码生成的文件

创建TLC块文件之后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成一个rtwmakecfg。M文件支持代码生成。万博1manbetx如果S-functions所需的源文件和头文件不在与S-functions相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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作为通过生成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增益标量(常量FLT输入,常量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 -函数源文件后,要用Simulink®编译用于仿真的s -函数,使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
# # #开始编译rtwdemo_sfun_gain_scalar墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_55302 / tpb5f27a0b / ex09148220 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_55302 / tp0fc574e4_6a9d_4835_baa3_ec0f7db172e5 ',“/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c”)使用“gcc”构建。墨西哥人成功完成。/tmp/Bdoc18a_827493_55302/tpb5f27a0b/ex09148220', '/tmp/Bdoc18a_827493_55302/tp0fc574e4_6a9d_4835_baa3_ec0f7db172e5/gainScalar.o')使用gcc构建。墨西哥人成功完成。###完成rtwdemo_sfun_gain_scalar编译### #退出

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

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

legacy_code (“sfcn_tlc_generate”def);

生成一个rtwmakecfg。m用于代码生成的文件

创建TLC块文件之后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成一个rtwmakecfg。M文件支持代码生成。万博1manbetx如果S-function所需的源文件和头文件不在与S-function相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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(“帮助”).在这个例子中调用的遗留函数的原型是:

const uint8_T fracLength(常量常量)

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

myFixpt = 万博1manbetxSimulink.NumericType;myFixpt。DataTypeMode =“定点:二进制点缩放”;myFixpt。签署= true;myFixpt。字= 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 -函数源文件后,要用Simulink®编译用于仿真的s -函数,使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
# # #开始编译rtwdemo_sfun_times_s16墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_68601 / tpc59ece72 / ex96454812 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_68601 / tp112e0c7e_c607_4626_8a6f_c89e4eb7617e ','/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c')墨西哥人成功完成。-I/tmp/Bdoc18a_827493_68601/tpc59ece72/ex96454812', '/tmp/Bdoc18a_827493_68601/tp112e0c7e_c607_4626_8a6f_c89e4eb7617e/timesS16.o')使用“gcc”构建。墨西哥人成功完成。###完成rtwdemo_sfun_times_s16的编译

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

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

legacy_code (“sfcn_tlc_generate”def);

生成一个rtwmakecfg。m用于代码生成的文件

创建TLC块文件之后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成一个rtwmakecfg。M文件支持代码生成。万博1manbetx如果S-function所需的源文件和头文件不在与S-function相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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 *input, COUNTERBUS *mem, COUNTERBUS *output);

Mem是应用一个集成步骤延迟的实例特定的持久内存。中定义的结构类型counterbus.h并用Simulink实现。万博1manbetx公共汽车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 -函数源文件后,要用Simulink®编译用于仿真的s -函数,使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
# # #开始编译rtwdemo_sfun_work墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_66741 / tp0b2cdc89 / ex38707886 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_66741 / tpff485c12_ae92_4e81_a172_b1fe187ad22a ','/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/memory_bus.c')墨西哥人成功完成。-I/tmp/Bdoc18a_827493_66741/tp0b2cdc89/ex38707886', '/tmp/Bdoc18a_827493_66741/tpff485c12_ae92_4e81_a172_b1fe187ad22a/memory_bus.o')使用gcc构建。墨西哥人成功完成。###完成rtwdemo_sfun_work的编译

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

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

legacy_code (“sfcn_tlc_generate”def);

生成一个rtwmakecfg。m用于代码生成的文件

创建TLC块文件之后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成一个rtwmakecfg。M文件支持代码生成。万博1manbetx如果S-function所需的源文件和头文件不在与S-function相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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®总线和遗留代码工具的结构参数与遗留C函数集成。万博1manbetx

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

  • 提供遗留功能规范。

  • 生成一个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实现。万博1manbetx公共汽车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 -函数源文件后,要用Simulink®编译用于仿真的s -函数,使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
# # #开始编译rtwdemo_sfun_counterbus墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_68601 / tpc59ece72 / ex90330074 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_68601 / tp5d249d80_b0dd_4681_8255_814398db6e53 ','/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/counterbus.c')使用gcc构建。墨西哥人成功完成。/tmp/Bdoc18a_827493_68601/tpc59ece72/ex90330074', '/tmp/Bdoc18a_827493_68601/tp5d249d80_b0dd_4681_8255_814398db6e53/counterbus.o')使用gcc构建。墨西哥人成功完成。###完成rtwdemo_sfun_counterbus的编译

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

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

legacy_code (“sfcn_tlc_generate”def);

生成一个rtwmakecfg。m用于代码生成的文件

创建TLC块文件之后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成一个rtwmakecfg。M文件支持代码生成。万博1manbetx如果S-function所需的源文件和头文件不在与S-function相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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\u lct\u总线”) open_system (“rtwdemo_lct_bus / TestCounter”) sim卡(“rtwdemo\u lct\u总线”

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

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

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

  • 提供遗留功能规范。

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

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

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

提供遗留功能规范

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

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 -函数源文件后,要用Simulink®编译用于仿真的s -函数,使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
# # #开始编译rtwdemo_sfun_cplx_gain墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_68951 / tpd8e15221 / ex97344681 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_68951 / tp70b7996e_20ec_4ed6_b61a_10c443461e63 ','/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ cplxget .c')墨西哥人成功完成。/tmp/Bdoc18a_827493_68951/tpd8e15221/ex97344681', '/tmp/Bdoc18a_827493_68951/tp70b7996e_20ec_4ed6_b61a_10c443461e63/ cplxget .o')使用gcc构建。墨西哥人成功完成。###完成rtwdemo_sfun_cplx_gain的编译

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

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

legacy_code (“sfcn_tlc_generate”def);

生成一个rtwmakecfg。m用于代码生成的文件

创建TLC块文件之后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成一个rtwmakecfg。M文件支持代码生成。万博1manbetx如果S-function所需的源文件和头文件不在与S-function相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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用于通过生成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 nbRows, 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

def = [];% 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”};def = [def;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”};def = [def;def);

为仿真生成s函数

要根据输入参数'defs'提供的描述生成C-MEX S-functions,请再次调用函数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 -函数源文件后,要用Simulink®编译用于仿真的s -函数,请使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
### Start compilation rtwdemo_sfun_mat_add mex('-I/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemo /rtwdemo_lct_src', '-I/tmp/Bdoc18a_827493_66738/tp1662055e/ex89794148', '-c', '-outdir', '/tmp/Bdoc18a_827493_66738/tp0d022ce9_2ef7_42b1_b604_05134b4a7b02'),'/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')墨西哥人成功完成。-I/tmp/Bdoc18a_827493_66738/tp1662055e/ex89794148', '/tmp/Bdoc18a_827493_66738/tp0d022ce9_2ef7_42b1_b604_05134b4a7b02/ mat_os .o')使用gcc构建。墨西哥人成功完成。# # #完成编译rtwdemo_sfun_mat_add退出# # # # # #开始编译rtwdemo_sfun_mat_mult墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_66738 / tp1662055e / ex89794148 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_66738 / tp8f4220d6_b280_4847_8aa6_309bc7e82890 ','/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/mat_ops.c')墨西哥人成功完成。-I/tmp/Bdoc18a_827493_66738/tp1662055e/ex89794148', '/tmp/Bdoc18a_827493_66738/tp8f4220d6_b280_4847_8aa6_309bc7e82890/ mat_os .o')使用gcc构建。墨西哥人成功完成。 ### Finish Compiling rtwdemo_sfun_mat_mult ### Exit

为代码生成生成TLC块文件

在编译s -函数并在模拟中使用它们之后,可以再次调用函数legacy_code(),将第一个输入设置为'sfcn_tlc_generate',以生成TLC块文件。块文件指定为模型生成的代码如何调用遗留代码。如果不生成TLC块文件,而试图为包含S-functions的模型生成代码,则代码生成将失败。S-functions的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文件支持代码生成。万博1manbetx如果S-functions所需的源文件和头文件不在与S-functions相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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 initFaultCounter(unsigned int *counter)

  • 空白openLogFile (void * * fid)

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

  • 空白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 -函数源文件后,要用Simulink®编译用于仿真的s -函数,使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
# # #开始编译rtwdemo_sfun_fault墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_68951 / tpd8e15221 / ex46254423 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_68951 / tp88d2eda5_f8f3_4194_befb_a508098bfa53 ',/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/fault.c墨西哥人成功完成。-I/tmp/Bdoc18a_827493_68951/tpd8e15221/ex46254423', '/tmp/Bdoc18a_827493_68951/tp88d2eda5_f8f3_4194_befb_a508098bfa53/fault.o')使用“gcc”构建。墨西哥人成功完成。###完成rtwdemo_sfun_fault的编译

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

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

legacy_code (“sfcn_tlc_generate”def);

生成一个rtwmakecfg。m用于代码生成的文件

创建TLC块文件之后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成一个rtwmakecfg。M文件支持代码生成。万博1manbetx如果S-function所需的源文件和头文件不在与S-function相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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®产品块的输出进行比较;万博1manbetx结果应该是相同的。

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

集成外部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 nbRows, 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 -函数源文件后,要用Simulink®编译用于仿真的s -函数,使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
# # #开始编译rtwdemo_sfun_ndarray_add墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_68951 / tpd8e15221 / ex14927435 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_68951 / tp996d9615_26b6_4bf0_9f1e_3618e2af52cd ','/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/ndarray_ops.c')墨西哥人成功完成。/tmp/Bdoc18a_827493_68951/tpd8e15221/ex14927435', '/tmp/Bdoc18a_827493_68951/tp996d9615_26b6_4bf0_9f1e_3618e2af52cd/ ndarray_os .o')使用` gcc `构建。墨西哥人成功完成。###完成rtwdemo_sfun_ndarray_add的编译

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

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

legacy_code (“sfcn_tlc_generate”def);

生成一个rtwmakecfg。m用于代码生成的文件

创建TLC块文件之后,可以再次调用函数legacy_code(),将第一个输入设置为'rtwmakecfg_generate',以生成一个rtwmakecfg。M文件支持代码生成。万博1manbetx如果S-function所需的源文件和头文件不在与S-function相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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增益标量(常量FLT输入,常量FLT增益)

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

def = [];%rtwdemo\u sfun\u st\udef = 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”};def = [def;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];def = [def;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 =“参数化”;def = [def;def);

为仿真生成s函数

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

legacy_code (“sfcn_cmex_generate”def);

编译生成的仿真s函数

生成C-MEX s -函数源文件后,要用Simulink®编译用于仿真的s -函数,请使用第一个输入集“compile”再次调用函数legacy_code()。万博1manbetx

legacy_code (“编译”def);
### Start compilation rtwdemo_sfun_st_inherited mex('-I/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemo /rtwdemo_lct_src', '-I/tmp/Bdoc18a_827493_55302/tpb5f27a0b/ex74504488', '-c', '-outdir', '/tmp/Bdoc18a_827493_55302/tp0d53fe21_85b0_4156_a12d_7219f3099fb6'),“/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c”)使用“gcc”构建。墨西哥人成功完成。/tmp/Bdoc18a_827493_55302/tpb5f27a0b/ex74504488', '/tmp/Bdoc18a_827493_55302/tp0d53fe21_85b0_4156_a12d_7219f3099fb6/gainScalar.o')使用gcc构建。墨西哥人成功完成。# # #完成编译rtwdemo_sfun_st_inherited退出# # # # # #开始编译rtwdemo_sfun_st_fixed墨西哥人(“我/ mathworks猛击/棒/ Bdoc18a /构建/ matlab /工具箱/ rtw / rtwdemos / rtwdemo_lct_src ', ' - i / tmp / Bdoc18a_827493_55302 / tpb5f27a0b / ex74504488 ', ' c ', ' -outdir ', ' / tmp / Bdoc18a_827493_55302 / tp45e2008f_f3e0_426f_af04_026a6bd066ee ',“/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c”)使用“gcc”构建。墨西哥人成功完成。/tmp/Bdoc18a_827493_55302/tpb5f27a0b/ex74504488', '/tmp/Bdoc18a_827493_55302/tp45e2008f_f3e0_426f_af04_026a6bd066ee/gainScalar.o')使用gcc构建。墨西哥人成功完成。 ### Finish Compiling rtwdemo_sfun_st_fixed ### Exit ### Start Compiling rtwdemo_sfun_st_parameterized mex('-I/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc18a_827493_55302/tpb5f27a0b/ex74504488', '-c', '-outdir', '/tmp/Bdoc18a_827493_55302/tp8a2be555_eac1_4e54_a714_944fcf4cd235', '/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/gainScalar.c') Building with 'gcc'. MEX completed successfully. mex('rtwdemo_sfun_st_parameterized.c', '-I/mathworks/devel/bat/Bdoc18a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc18a_827493_55302/tpb5f27a0b/ex74504488', '/tmp/Bdoc18a_827493_55302/tp8a2be555_eac1_4e54_a714_944fcf4cd235/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-functions的模型生成代码,则代码生成将失败。S-functions的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文件支持代码生成。万博1manbetx如果S-functions所需的源文件和头文件不在与S-functions相同的文件夹中,并且您希望将这些依赖项添加到代码生成期间生成的makeffg中,则生成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”

另请参阅

相关的话题

这个话题有用吗?