主要内容

调用外部代码导入生成的代码与遗留代码的工具

遗留代码和代码生成工具

您可以使用仿真软件万博1manbetx®遗留代码的工具生成完全内联C墨西哥人S-functions遗留或自定义代码。S-functions嵌入式组件的优化,如设备驱动程序和查找表,调用现有的C或c++函数。

请注意

遗留代码工具可以用c++函数接口,而不是c++对象。为了解决这个问题,这样的工具可以用c++对象接口,明白了遗留代码工具的局限性

您可以使用工具:

  • 编译和构建模拟生成的功能。

  • 生成一个蒙面的功能块配置调用现有的外部代码。

如果你想要包括这些类型的模型中S-functions你打算生成代码,使用该工具来生成一个薄块文件。TLC块文件指定如何生成的代码模型调用现有的C或c++函数。

如果功能取决于以外的文件在文件夹包含s函数动态可加载的可执行文件的文件夹,使用该工具来生成一个sFunction_makecfg.mrtwmakecfg.m文件功能。生成的文件维护这些依赖项当你构建一个模型,其中包括功能。例如,对于某些应用程序,如定制目标,您可能想要在有针对性的位置定位文件。构建过程寻找sFunction_makecfg.mrtwmakecfg.m在相同的文件夹功能动态可加载的可执行文件中调用函数。

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

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

取决于您的应用程序的代码生成需求,来生成代码模型,利用s函数,做下面的:

  • 生成一个. cpp文件为内联函数。在遗留代码工具数据结构,设置的值Options.singleCPPMexFile字段真正的在生成s函数之前源文件从您现有的C函数。例如:

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

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

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

singleCPPMexFile局限性

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

  • Options.language =“c++”

  • 您使用以下模型对象之一万博1manbetxIsAlias属性设置为真正的:

    • 万博1manbetxSimulink.Bus

    • 万博1manbetxSimulink.AliasType

    • 万博1manbetxSimulink.NumericType

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

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

代码风格设置适用于遗留功能

模型配置参数代码风格应用于遗留功能:

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

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

    def.Options.singleCPPMexFile= true;

检查设置,输入:

def.Options.singleCPPMexFile

singleCPPMexFile局限性

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

  • Options.language =“c++”

  • 您使用以下模型对象之一万博1manbetxIsAlias属性设置为真正的:

    • 万博1manbetxSimulink.Bus

    • 万博1manbetxSimulink.AliasType

    • 万博1manbetxSimulink.NumericType

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

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

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

默认情况下,遗留代码工具假设文件的函数依赖驻留在相同的文件夹功能的动态可加载的可执行文件。如果你的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);

如果您使用多个注册文件在同一文件夹,并为每个文件生成一个函数调用legacy_code时,调用legacy_code指定“sfcn_makecfg_generate”“rtwmakecfg_generate”必须共同所有注册文件。有关更多信息,请参见处理多个注册文件

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

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

有关更多信息,请参见支持S-Fu万博1manbetxnctions

部署S-Functions模拟和代码生成

您可以部署S-functions与遗留代码生成工具,这样其他人可以使用它们。部署一个模拟和代码生成功能,分享以下文件:

  • 注册文件

  • 编译动态可加载可执行

  • TLC块文件

  • sFunction_makecfg.mrtwmakecfg.m文件

  • 头,来源,包括生成的s函数所依赖的文件

当你使用这些部署文件:

  • 在仿真软件模型,使用已部署的文件之前添加的文件夹,其中包含MATLAB的s万博1manbetx函数文件®路径。

  • 如果遗留代码工具所需数据结构寄存器文件绝对路径和文件的位置发生变化时,重新生成sFunction_makecfg.mrtwmakecfg.m文件。

集成外部c++对象

遗留代码工具可以用c++函数接口,而不是c++对象。使用前面的示例作为起点,这是一个例子,如何解决这个限制。

  • 修改的类定义加法器在一个新文件adder_cpp.hpp。添加三个新宏,动态地分配一个新的加法器对象,调用该方法add_one (),自由分配的内存。每个宏需要一个指针加法器对象。因为每个函数调用遗留代码工具必须有一个c签名,缓存和传递的指针void *。然后您必须显式地投加法器*在宏。新的类定义加法器:

    的ifndef _ADDER_CPP_ #定义_ADDER_CPP_类加法器{私人:int int_state;公众:加法器():int_state (0) {};int add_one (int增量);int get_val(){返回int_state;};};/ /包装方法实现为宏# define createAdder (work1) \ * (work1) =新加法器# define deleteAdder (work1) \删除(static_cast <加法器* > (* (work1))) # define adderOutput (work1 u1) \ (static_cast <加法器* > ((work1))) - > add_one (u1) # endif / * _ADDER_CPP_ * /
  • 更新adder_cpp.cpp。与类修改,而不是一个全局实例,每个生成的功能管理自己的加法器对象。

    # include“adder_cpp。进行“整数加法器::add_one (int增量){int_state + =增量;返回int_state;}
  • 更新rtwdemo_sfun_adder_cpp.cpp用以下变化:

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

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

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

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

另请参阅

相关的话题