Main Content

集成外部 C++ 对象方法

通过使用代码继承工具,集成已有的 C++ 对象方法。

使用代码继承工具,您可以:

  • 提供已有函数设定。

  • 生成在仿真过程中调用现有代码的 C++ MEX S-Function。

  • 编译生成的 S-Function 以进行仿真。

  • 生成模块 TLC 文件和可选的 rtwmakecfg.m 文件,用于在代码生成过程中调用现有代码。

提供已有函数设定

代码继承工具附带的函数接受特定的数据结构体或结构体数组作为参数。可以通过调用函数 legacy_code() 并使用 'initialize' 作为第一个输入来初始化数据结构体。初始化结构体之后,将其属性指定给与要集成的现有代码对应的值。此示例中已有 C++ 类的定义为:

class adder {
  private:
      int int_state;
  public:
      adder();
      int add_one(int increment);
      int get_val();
};

已有源代码位于文件 adder_cpp.hadder_cpp.cpp 中。

% rtwdemo_sfun_adder_cpp
def = legacy_code('initialize');
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-Function 进行仿真

要根据输入参数 'def' 提供的描述生成 C-MEX S-Function,请再次调用函数 legacy_code() 并将第一个输入设置为 'sfcn_cmex_generate'。S-Function 将在仿真过程中调用已有函数。S-Function 的源代码位于文件 rtwdemo_sfun_adder_cpp.cpp 中。

legacy_code('sfcn_cmex_generate', def);

编译生成的 S-Function 进行仿真

在生成 C-MEX S-Function 源文件之后,要使用 Simulink® 编译 S-Function 进行仿真,请再次调用函数 legacy_code() 并将第一个输入设置为 'compile'。

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_adder_cpp
    mex('-I/mathworks/devel/bat/Bdoc23a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc23a_2181783_2676402/tpfa4d6568/simulinkcoder-ex06428671', '-c', '-outdir', '/tmp/Bdoc23a_2181783_2676402/tp5ae57eec_1789_49aa_8158_f9b027e73a04', '/mathworks/devel/bat/Bdoc23a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/adder_cpp.cpp')
Building with 'g++'.
MEX completed successfully.
    mex('rtwdemo_sfun_adder_cpp.cpp', '-I/mathworks/devel/bat/Bdoc23a/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/Bdoc23a_2181783_2676402/tpfa4d6568/simulinkcoder-ex06428671', '-cxx', '/tmp/Bdoc23a_2181783_2676402/tp5ae57eec_1789_49aa_8158_f9b027e73a04/adder_cpp.o')
Building with 'g++'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_adder_cpp
### Exit

生成 TLC 模块文件以进行代码生成

编译 S-Function 并将其用于仿真之后,您可以再次调用函数 legacy_code()。将第一个输入设置为 'sfcn_tlc_generate',以生成支持通过 Simulink® Coder™ 生成代码的 TLC 模块文件。如果不创建 TLC 模块文件,则当您尝试为包含 S-Function 的模型生成代码时,代码生成将失败。S-Function 的 TLC 模块文件为 rtwdemo_sfun_adder_cpp.tlc

legacy_code('sfcn_tlc_generate', def);

生成 rtwmakecfg.m 文件以进行代码生成

创建 TLC 模块文件之后,您可以再次调用函数 legacy_code()。将第一个输入设置为 'rtwmakecfg_generate',以生成支持通过 Simulink® Coder™ 生成代码的 rtwmakecfg.m 文件。如果 S-Function 需要的源文件和头文件与 S-Function 不在同一个文件夹中,而您要将这些相关文件添加到代码生成过程中生成的联编文件中,请生成 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')

另请参阅

相关主题