您可以使用simulink万博1manbetx®遗留代码的工具为遗留代码或自定义代码生成完全内联的C MEX s函数。s函数针对嵌入式组件进行了优化,如设备驱动程序和查找表,它们调用现有的C或c++函数。
请注意
遗留代码工具可以与C ++函数界面,但不是C ++对象。要解决此问题,以便该工具可以与C ++对象进行界面,请参阅遗留代码工具限制。
您可以使用该工具:
如果要在打算生成代码的模型中包含这些类型的S函数,请使用该工具生成TLC块文件。TLC块文件指定模型的生成代码如何调用现有的C或C ++函数。
如果s函数依赖于包含s函数可动态加载可执行文件的文件夹以外的文件夹中的文件,则使用该工具生成一个答案
_makecfg.m
或者RTWMAKECFG.M.
s函数的文件。当您构建包含s函数的模型时,生成文件将维护这些依赖项。例如,对于某些应用程序(如自定义目标),您可能希望将文件定位到特定于目标的位置。构建过程寻找答案
_makecfg.m
或者RTWMAKECFG.M.
在与S函数的相同文件夹中动态可加载可执行文件并调用文件中的函数。
有关更多信息,请参阅使用遗留代码工具集成C函数。
根据您的应用程序的代码生成要求,要为使用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
领域真的
如果
Options.language =“c++”
控件中使用以下Simulink对象之一万博1manbetxIsAlias
属性设置为真的
:
万博1manbetxsimulink.bus.
万博1manbetx仿真软件。AliasType
万博1manbetx仿真软件。NumericType
遗留代码工具功能规范包括空白*
或者void * *
表示状态参数的标量工作数据
头文件
遗留代码工具结构的字段指定多个头文件
要将代码样式的模型配置参数应用到遗留函数:
初始化遗留代码工具数据结构。例如:
def = letacacy_code('初始化');
在数据结构中设置options.singlecppmexfile.
领域真的
。例如:
def.Options.singleCPPMexFile = true;
要检查设置,输入:
def.Options.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函数,共享以下文件:
注册文件
编译动态加载可执行文件
TLC块文件
答案
_makecfg.m
或者RTWMAKECFG.M.
文件
标题,源,包括生成的S函数所取决于的文件
当您使用这些已部署文件时:
在使用Simulink模型中使用已部署的文件之前,请将包含S函数文件的文件万博1manbetx夹添加到MATLAB中®路径。
如果遗留代码工具数据结构将所需的文件注册为绝对路径,并且文件的位置发生更改,请重新生成答案
_makecfg.m
或者RTWMAKECFG.M.
文件。
遗留代码工具可以与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)';