主要内容

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

遗留代码工具和代码生成

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

请注意

遗留代码工具可以与C ++函数界面,但不是C ++对象。要解决此问题,以便该工具可以与C ++对象进行界面,请参阅遗留代码工具限制

您可以使用该工具:

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

  • 生成屏蔽的S函数块它被配置为调用现有的外部代码。

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

如果s函数依赖于包含s函数可动态加载可执行文件的文件夹以外的文件夹中的文件,则使用该工具生成一个答案_makecfg.m或者RTWMAKECFG.M.s函数的文件。当您构建包含s函数的模型时,生成文件将维护这些依赖项。例如,对于某些应用程序(如自定义目标),您可能希望将文件定位到特定于目标的位置。构建过程寻找答案_makecfg.m或者RTWMAKECFG.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对象之一万博1manbetxIsAlias属性设置为真的:

    • 万博1manbetxsimulink.bus.

    • 万博1manbetx仿真软件。AliasType

    • 万博1manbetx仿真软件。NumericType

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

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

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

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

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

    def = letacacy_code('初始化');
  2. 在数据结构中设置options.singlecppmexfile.领域真的。例如:

    def.Options.singleCPPMexFile = true;

要检查设置,输入:

def.Options.singleCPPMexFile

singlecppmexfile限制

你不能设置singleCPPMexFile领域真的如果

  • Options.language =“c++”

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

    • 万博1manbetxsimulink.bus.

    • 万博1manbetx仿真软件。AliasType

    • 万博1manbetx仿真软件。NumericType

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

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

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

默认情况下,遗留代码工具假定哪个文件函数依赖于与S函数的动态可加载的可执行文件相同的文件夹中。如果您的s函数取决于驻留在其他地方的文件,并且您使用模板makefile构建过程,请生成一个答案_makecfg.m或者RTWMAKECFG.M.文件s函数。例如,如果Legacy Code Tool数据结构将编译资源定义为路径名,则可以生成此文件。

生成答案_makecfg.m或者RTWMAKECFG.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',defs);

有关更多信息,请参阅构建对S函数万博1manbetx的支持

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

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

  • 注册文件

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

  • TLC块文件

  • 答案_makecfg.m或者RTWMAKECFG.M.文件

  • 标题,源,包括生成的S函数所取决于的文件

当您使用这些已部署文件时:

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

  • 如果遗留代码工具数据结构将所需的文件注册为绝对路径,并且文件的位置发生更改,请重新生成答案_makecfg.m或者RTWMAKECFG.M.文件。

集成外部c++对象

遗留代码工具可以与C ++函数界面,但不是C ++对象。使用前一个示例作为起点,这里是如何解决此限制的示例。

  • 的类定义加法器在一个新文件中Adder_cpp.hpp.。添加三个新宏,动态分配一个new加法器对象,调用该方法add_one(),释放分配的内存。每个宏都有一个指向加法器目的。因为遗留代码工具调用的每个函数都必须具有c样签名,因此指针被缓存并传递为一个空白*。然后你必须明确地投下来加法者*在宏。的新类定义加法器:

    #ifndef _ADDER_CPP_ #define _ADDER_CPP_类加法器{private: int int_state;Public: addder (): 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_cpp.hpp" int adder::add_one(int increment) {int_state += increment;返回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)';

另请参阅

相关话题