你可以使用Simulink金宝app®代码继承工具为遗留代码或自定义代码生成完全内联的C MEX S函数。S函数对嵌入式组件(如设备驱动程序和查找表)进行了优化,并且调用了现有的C或C++函数。
笔记
遗留代码工具可以与c++函数交互,但不能与c++对象交互。要解决这个问题,以便工具可以与c++对象交互,请参见遗留代码工具的限制.
您可以使用该工具来:
如果您想要在您想要生成代码的模型中包含这些类型的s -函数,请使用该工具生成一个TLC块文件。TLC块文件指定为模型生成的代码如何调用现有的C或c++函数。
如果S函数依赖于文件夹中的文件,而不是包含S函数可动态加载可执行文件的文件夹,请使用该工具生成sFunction
_makecfg.m
或rtwmakecfg.m
S函数的文件。生成文件将在构建包含S函数的模型时维护这些依赖关系。例如,对于某些应用程序(如自定义目标),您可能希望在特定于目标的位置查找文件。构建过程寻找sFunction
_makecfg.m
或rtwmakecfg.m
动态加载可执行文件,并调用文件中的函数。
有关更多信息,请参见使用遗留代码工具集成C函数.
根据应用程序的代码生成需求,要为使用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);
您不能设置单CPPMEXFILE
字段真正的
如果
Options.language='C++'
将以下Simulink对象之一用于金宝app伊莎莉亚
属性设置为真正的
:
金宝app仿真软件。公共汽车
金宝appSimulink.AliasType
金宝appSimulink.NumericType
遗留代码工具功能规范包括void *
或空虚**
表示状态参数的标量工作数据
HeaderFiles
字段指定多个头文件
要将代码样式的模型配置参数应用于旧功能,请执行以下操作:
初始化旧代码工具数据结构。例如:
def = legacy_code(“初始化”);
在数据结构中,设置Options.singleCPPMexFile
字段真正的
. 例如:
def.Options.singleCPPMexFile = true;
要检查设置,请输入:
def.Options.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.m
或rtwmakecfg.m
文件对于S函数。例如,如果旧代码工具数据结构将编译资源定义为路径名,则可能会生成此文件。
生成sFunction
_makecfg.m
或rtwmakecfg.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 -函数,请共享以下文件:
注册文件
编译的可动态加载的可执行文件
TLC块文件
sFunction
_makecfg.m
或rtwmakecfg.m
文件
生成的s函数所依赖的头文件、源文件和include文件
使用这些已部署文件时:
在使用Simulink模型中部署的文件之前,将包含S-function文件金宝app的文件夹添加到MATLAB中®路径
如果旧代码工具数据结构将所需文件注册为绝对路径,并且文件位置发生更改,请重新生成sFunction
_makecfg.m
或rtwmakecfg.m
文件。
遗留代码工具可以与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');