主要内容

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

遗留代码工具和代码生成

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

笔记

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

您可以使用该工具来:

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

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

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

如果S函数依赖于文件夹中的文件,而不是包含S函数可动态加载可执行文件的文件夹,请使用该工具生成sFunction_makecfg.mrtwmakecfg.mS函数的文件。生成文件将在构建包含S函数的模型时维护这些依赖关系。例如,对于某些应用程序(如自定义目标),您可能希望在特定于目标的位置查找文件。构建过程寻找sFunction_makecfg.mrtwmakecfg.m动态加载可执行文件,并调用文件中的函数。

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

生成用于代码生成的内联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局限性

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

  • Options.language='C++'

  • 将以下Simulink对象之一用于金宝app伊莎莉亚属性设置为真正的:

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

    • 金宝appSimulink.AliasType

    • 金宝appSimulink.NumericType

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

  • HeaderFiles字段指定多个头文件

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

要将代码样式的模型配置参数应用于旧功能,请执行以下操作:

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

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

    def.Options.singleCPPMexFile = true;

要检查设置,请输入:

def.Options.singleCPPMexFile

singleCPPMexFile局限性

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

  • Options.language='C++'

  • 将以下Simulink对象之一用于金宝app伊莎莉亚属性设置为真正的:

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

    • 金宝appSimulink.AliasType

    • 金宝appSimulink.NumericType

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

  • HeaderFiles字段指定多个头文件

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

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

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

遗留代码('sfcn\U makecfg\U generate',lct\U spec);

如果在同一文件夹中使用多个注册文件,并通过对的单个调用为每个文件生成S函数旧式代码,呼吁旧式代码指定“sfcn_makecfg_generate”“rtwmakecfg_生成”所有注册文件必须是共同的。有关更多信息,请参见处理多个注册文件

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

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

有关更多信息,请参见建立对s功能金宝app的支持

部署用于模拟和代码生成的S函数

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

  • 注册文件

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

  • TLC块文件

  • sFunction_makecfg.mrtwmakecfg.m文件

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

使用这些已部署文件时:

  • 在使用Simulink模型中部署的文件之前,将包含S-function文件金宝app的文件夹添加到MATLAB中®路径

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

集成外部C++对象

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

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

    #ifndef加法器定义加法器类加法器{private:int int int_state;public:ADDER():int_state(0){};int add_one(int increment);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/*\u adder\u CPP*/
  • 更新加法器. 通过修改类,而不是一个全局实例,每个生成的S函数管理自己的实例加法器对象。

    #include“adder\u cpp.hpp”int adder::add_one(int increment){int_state+=increment;return int_state;}
  • 更新rtwdemo\u sfun\u加法器\u cpp.cpp作出以下更改:

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

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

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

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

另见

相关的话题