调用外部代码导入生成的代码与遗留代码的工具
遗留代码和代码生成工具
您可以使用仿真软件万博1manbetx®遗留代码的工具生成完全内联C墨西哥人S-functions遗留或自定义代码。S-functions嵌入式组件的优化,如设备驱动程序和查找表,调用现有的C或c++函数。
请注意
遗留代码工具可以用c++函数接口,而不是c++对象。为了解决这个问题,这样的工具可以用c++对象接口,明白了遗留代码工具的局限性。
您可以使用工具:
如果你想要包括这些类型的模型中S-functions你打算生成代码,使用该工具来生成一个薄块文件。TLC块文件指定如何生成的代码模型调用现有的C或c++函数。
如果功能取决于以外的文件在文件夹包含s函数动态可加载的可执行文件的文件夹,使用该工具来生成一个sFunction
_makecfg.m
或rtwmakecfg.m
文件功能。生成的文件维护这些依赖项当你构建一个模型,其中包括功能。例如,对于某些应用程序,如定制目标,您可能想要在有针对性的位置定位文件。构建过程寻找sFunction
_makecfg.m
或rtwmakecfg.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++”
您使用以下模型对象之一万博1manbetx
IsAlias
属性设置为真正的
:万博1manbetxSimulink.Bus
万博1manbetxSimulink.AliasType
万博1manbetxSimulink.NumericType
遗留代码工具包括一个功能规范
void *
或void * *
代表标量数据工作状态参数HeaderFiles
遗留代码工具结构的字段指定多个头文件
代码风格设置适用于遗留功能
模型配置参数代码风格应用于遗留功能:
初始化遗留代码工具数据结构。例如:
def = legacy_code(“初始化”);
在数据结构中,设置的值
Options.singleCPPMexFile
字段真正的
。例如:def.Options.singleCPPMexFile= true;
检查设置,输入:
def.Options.singleCPPMexFile
singleCPPMexFile局限性
你不能设置singleCPPMexFile
字段真正的
如果
Options.language =“c++”
您使用以下模型对象之一万博1manbetx
IsAlias
属性设置为真正的
:万博1manbetxSimulink.Bus
万博1manbetxSimulink.AliasType
万博1manbetxSimulink.NumericType
遗留代码工具包括一个功能规范
void *
或void * *
代表标量数据工作状态参数HeaderFiles
遗留代码工具结构的字段指定多个头文件
在不同的位置地址依赖文件
默认情况下,遗留代码工具假设文件的函数依赖驻留在相同的文件夹功能的动态可加载的可执行文件。如果你的s函数取决于文件驻留在其他地方,您使用的是模板makefile构建过程,生成一个sFunction
_makecfg.m
或rtwmakecfg.m
文件s函数。例如,你可能会生成这个文件如果你遗留代码工具数据结构定义编译资源路径名。
生成sFunction
_makecfg.m
或rtwmakecfg.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.m
或rtwmakecfg.m
文件头,来源,包括生成的s函数所依赖的文件
当你使用这些部署文件:
在仿真软件模型,使用已部署的文件之前添加的文件夹,其中包含MATLAB的s万博1manbetx函数文件®路径。
如果遗留代码工具所需数据结构寄存器文件绝对路径和文件的位置发生变化时,重新生成
sFunction
_makecfg.m
或rtwmakecfg.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)”;