主要内容

使用遗留代码工具集成C函数

概述

您可以将现有的C(或C++)函数(如设备驱动程序、查找表以及通用函数和接口)集成到Simulink中万博1manbetx®通过使用遗留代码工具建立模型。使用规范,你提供作为MATLAB®代码中,该工具将现有函数转换为可包含在Simulink模型中的C MEX S函数。如果你使用万博1manbetx万博1manbetxSimulink编码器™生成的代码,修改代码工具可以插入到你的C函数一个合适的呼叫到生成的代码。有关详细信息,请参阅使用遗留代码工具将外部代码导入外部代码的调用(万博1manbetxSimulink编码器)

与使用S-Function Builder或编写S-Function相比,Legacy Code Tool更容易使用和生成嵌入式系统经常需要的优化代码(不生成包装器代码)。但是,考虑混合系统的替代方法,比如包含设备和控制器的系统,或者用C或c++以外的语言编写的系统组件。可选方法更灵活,因为它们支持更多特性和编程语言。万博1manbetx

要与遗留代码工具交互,您需要

  • 使用旧代码工具数据结构来指定

    • S函数的名称

    • 现有C函数的规范

    • 文件名和路径所需的编译

    • 生成的s函数的选项

  • 使用旧式代码函数

    • 初始化给定C函数的遗留代码工具数据结构

    • 生成仿真过程中使用的S-功能

    • 编译并将生成的s函数链接到一个可动态加载的可执行文件中

    • 生成用于调用生成的S函数的屏蔽S函数块

    • 生成一个TLC块的文件,如果有必要,一个功能_makecfg.mrtwmakecfg.m用于代码生成的文件(万博1manbetxSimulink编码器(需要产品许可证)

请注意

在可以使用旧式代码,确保为MATLAB安装设置了C编译器。

下图说明了使用遗留代码工具的一般过程。使用遗留代码工具将C函数集成到Simulink模型中万博1manbetx提供了一个使用传统代码工具来将现有的C函数为C MEX S函数的例子。

如果你有万博1manbetxSimulink编码器产品许可证,请参阅使用遗留代码工具将外部代码导入外部代码的调用(万博1manbetxSimulink编码器)有关使用旧代码工具生成代码的信息,请参见。

将C函数集成到万博1manbetx使用遗留代码工具的模型

此示例演示如何使用遗留代码工具将现有的C函数集成到Simulink模型中。万博1manbetx

假设您有一个C函数,它输出其浮点输入值乘以2。该函数在名为的源文件中定义doubleIt.c,并且其声明存在于名为加倍

  1. 初始化MATLAB结构def使用表示旧代码工具属性的字段旧式代码功能。

    DEF = legacy_code( '初始化')

    名为的旧代码工具数据结构def在MATLAB命令窗口中显示它的字段如下所示:

    DEF = SFunctionName: '' InitializeConditionsFcnSpec: '' OutputFcnSpec: '' StartFcnSpec: '' TerminateFcnSpec: '' HeaderFiles:{} SourceFiles:{} HostLibFiles:{} TargetLibFiles:{} IncPaths:{} SrcPaths:{} LibPaths:{}SampleTime: '继承' 选项:[1x1的结构]
  2. 为遗留代码工具数据结构中的字段指定适当的值,以标识现有C函数的属性。例如,通过在MATLAB命令提示符下输入以下命令来指定C函数源和头文件名:

    def.SourceFiles = {' doubleIt.c '};def.HeaderFiles = {' doubleIt.h '};

    还必须指定有关遗留代码工具从C代码生成的S函数的信息。例如,通过输入以下内容指定S函数及其输出函数声明的名称:

    def.SFunctionName='ex_sfun_doubleit';def.outputfcsnspec='double y1=doubleit(double u1)';

    有关各种数据结构字段的信息,请参见旧式代码参考页。

  3. 方法从现有的C函数生成s函数源文件旧式代码作用在MATLAB命令提示下,键入:

    遗留_代码('sfcn_cmex_generate',def);

    旧代码工具使用中指定的信息def创建名为ex_sfun_doubleit.c在当前的MATLAB文件夹中。

  4. 使用万博1manbetx旧式代码作用在MATLAB命令提示下,键入:

    legacy_code(“编译”,def);

    以下消息显示在MATLAB命令窗口中:

    ###开始编译ex_sfun_doubleit mex('ex_sfun_doubleit.c', 'd:\work\lct_demos\doubleIt.c', '-Id:\work\lct\lct_demos') ### #完成编译ex_sfun_doubleit ###退出

    在32位的Microsoft上®窗户®系统中,生成的S函数可执行文件命名为ex_sfun_doubleit.mexw32

  5. 插入一个蒙面的系统函数块转换为Simulink模万博1manbetx型。

    遗留_代码('slblock_generate',def);

    Legacy Code Tool配置块以使用上一步中创建的C MEX s -函数。此外,工具遮罩块,以便它显示其值OutputFcnSpec属性(请参见旧式代码功能)。

  6. 将振幅为1的正弦波块添加到C-MEX S功能块的输入端,将示波器块添加到输出端。

    运行模拟。C-MEX S函数块返回其浮点输入值乘以2。它的行为类似于C函数加倍

集成C函数,其参数是指向结构体的指针

这个例子展示了如何使用遗留代码工具集成一个C函数,该函数的参数是指向结构的指针。

在Si万博1manbetxmulink®中,创建一个万博1manbetxSimulink.Bus对象来表示结构类型。在模型中使用总线信号来表示结构化信号和状态。在工作空间或块参数对话框中创建MATLAB结构来表示参数结构。

有关总线信号的基本信息,请参见虚拟总线.参数结构的基本信息请参见在结构中组织相关块参数定义.要创建总线对象,请参见创建和指定Simulink.Bus对象万博1manbetx

探索外部代码

将此自定义源代码复制到一个名为ex_mySrc_LCT.c在当前文件夹中。

#include " ex_mytypes_lcc .h" void myFcn(sigStructType *in, paramStructType *params, sigStructType *out) {out->sig1 = in->sig1 *params ->param1;Out ->sig2 = in->sig2 * params->param2 + params->param3;}

函数的参数myFcn是指向结构的指针。函数接受一个输入信号参数、一个参数参数和一个输出信号参数。

将此自定义头代码复制到一个名为ex_myTypes_LCT.h在当前文件夹中。

的#ifndef _MY_TYPES_H_的#define _MY_TYPES_H_ typedef结构{双SIG1;双SIG2;} sigStructType;typedef结构{双参数1;双参数2;双参数3;} paramStructType;空隙myFcn(sigStructType *在,paramStructType *参数,可以sigStructType *出);#万一

该文件定义了信号和参数结构类型myFcn使用。

在Simulink中创建总线对象以表示结构类型万博1manbetx

在命令提示下,使用函数万博1manbetxSimulink.ImportTexternalTypes在基本工作区中生成总线对象。

万博1manbetxSimulink.ImportTexternalTypes('ex_myTypes_LCT.h');

总线对象对应于结构类型ex_myTypes_LCT.h定义。

创建执行外部代码的块

创建一个结构变量,def,以存储调用外部代码的S函数的规范。使用函数旧式代码创建结构并设置默认值。

def = legacy_code (“初始化”);

将S函数的名称设置为sfun_ex_mySrc_LCT

def.SFunctionName=“sfun_ex_mySrc_LCT”

通过文件名标识外部源文件和头文件。

def.SourceFiles={“ex_mySrc_LCT.c”}; 定义头文件={'ex_myTypes_LCT.h'};

通过复制外部函数的原型,指定输出函数的原型,模型在每个模拟步骤中调用该原型myFcn。将参数的名称设置为u1p1y1表示输入参数、参数参数和输出参数。使用语法[1]指定每个参数都是指针。

def.OutputFcnSpec=['无效myFcn(sigStructType u1[1],'...' p1[1], sigStructType y1[1])'];

使用函数旧式代码要根据规范创建S函数和相应的C MEX可执行文件,def。请指定选项“为sim卡生成sim卡”准备s函数进行正常和加速模拟。

旧式代码(“为sim卡生成sim卡”def);
### Start compilation sfun_ex_mySrc_LCT ('-I/tmp/Bdoc21b_1757077_160094/tpf541d20d/ex12763634', '-c', '-outdir', '/tmp/Bdoc21b_1757077_160094/tp70d4139d_23c2_48bc_97f0_e7e95f91665a', '/tmp/Bdoc21b_1757077_160094/tpf541d20d/ex12763634/ex_mySrc_LCT.c')墨西哥人成功完成。/tmp/Bdoc21b_1757077_160094/tpf541d20d/ex12763634', '/tmp/Bdoc21b_1757077_160094/tp70d4139d_23c2_48bc_97f0_e7e95f91665a/ ex_mysrc_ltc .o')墨西哥人成功完成。###完成sfun_ex_mySrc_LCT的编译

创建一个模拟过程中调用S-功能的屏蔽S-功能块。

旧式代码(“slblock_generate”,DEF);

该块出现在一个新的模式。

要在模型中使用S功能块,请创建类型为的总线信号sigStructType用作块输入。块输出也是一个总线信号。块掩码接受一个参数,P1. 要设置参数值,请使用字段与结构类型匹配的MATLAB结构参数结构类型

验证外部代码的执行

创建线束模型,以验证仿真期间外部代码的执行情况。

举一个例子,查看模型ex_lct_结构

open_system (“ex_lct_struct”

在“常量块”对话框中,将定值参数设置为其字段与结构类型字段匹配的结构sigStructType.在信号的属性标签,输出数据类型设置为总线对象sigStructType

S函数块调用S函数sfun_ex_mySrc_LCT您创建。该块的输出进入一个总线选择块,其提取所述信号元件信号1sig2

S-Function块通过掩码对话框接受一个参数。创建MATLAB结构结构参数用作参数的值。

structParam=struct;structParam.param1=15;structParam.param2=20;structParam.param3=5;

或者,使用万博1manbetxSimulink.Parameter对象以包含该结构。如果使用参数对象,则可以通过使用总线对象设置结构的数据类型参数结构类型

structParam=Si万博1manbetxmulink.Parameter(structParam);structParam.DataType='总线:paramStructType'

在“遮罩”对话框中,设置P1结构参数

set_param (“ex_lct_struct / sfun_ex_mySrc_LCT”“SParameter1”“structParam”

模拟模型。范围块显示S函数块调用外部函数myFcn

open_system (“ex_lct_结构/范围”)开放式系统(“ex_lct_结构/范围1”) sim卡(“ex_lct_struct”

注册遗留代码工具数据结构

使用遗留代码工具的第一步是使用表示现有C代码和生成的S函数属性的字段注册一个或多个MATLAB结构。注册过程是灵活的。您可以选择设置资源并以多种方式启动注册,包括

  • 将所有必需的头文件和源文件放在当前工作文件夹或分层文件夹结构中

  • 在当前工作文件夹中生成并放置一个或多个S函数

  • 在同一文件夹中有一个或多个注册文件

要注册旧代码工具数据结构,请执行以下操作:

  1. 使用旧式代码功能,指定“初始化”作为第一个论点。

    lct_spec = legacy_code(初始化)

    名为的旧代码工具数据结构lct_spec在MATLAB命令窗口中显示其字段如下所示:

    lct_spec = SFunctionName: " InitializeConditionsFcnSpec: " OutputFcnSpec: " StartFcnSpec: " TerminateFcnSpec: " HeaderFiles: {} SourceFiles: {} HostLibFiles: {} TargetLibFiles: {} IncPaths: {} SrcPaths: {} LibPaths: {} SampleTime: 'inherited' Options: [1x1 struct]
  2. 定义应用于现有C函数和要生成的S函数的数据结构字段(属性)的值。至少,您必须指定

    • 现有C函数的源文件和头文件(源文件HeaderFiles

    • s函数的名称(SFunctionName

    • S函数至少有一个函数规范(初始化条件sfcnspecOutputFcnSpecStartFcnSpecTerminateFcnSpec

    有关完整列表,并在结构中的字段的说明,请参见旧式代码函数引用页面。

如果定义字段指定编译资源并指定相对路径,遗留代码工具搜索相对于以下目录中的资源,按以下顺序:

  1. 当前工作文件夹

  2. C-MEX S-function文件夹,如果与当前工作文件夹不同

  3. 您指定的目录

    • IncPaths对于头文件

    • SrcPaths对于源文件

    • LibPaths对于目标库和宿主库

  4. MATLAB搜索路径上的目录,不包括工具箱目录

声明遗留代码工具功能规范

初始化条件sfcnspecOutputFcnSpecStartFcnSpecTerminateFcnSpec在传统代码工具数据结构字段定义(参见的描述旧式代码函数)要求符合特定语法格式的字符向量值。所需的语法格式使Legacy Code工具能够将现有C函数的返回值和参数映射到工具生成的s函数的返回值、输入、输出、参数和工作向量。

一般语法

退货规格函数名参数规范

例如,以下字符向量指定了一个名为加倍与回报规范双y1以及输入参数说明双u1

def.OutputFcnSpec = 'double y1 = doubleIt(double u1)';

有关声明函数规范的更多详细信息,请参见

返回规范

返回规范定义了现有的C函数的返回值的数据类型和变量名。

返回式返回变量
返回式 中列出的数据类型万博1manbetx支持的数据类型
返回变量 表符y1y2...yn哪里n是输出参数的总数。

如果函数没有返回值,可以省略返回说明或将其指定为无效的

下表显示了整数返回值的有效函数规范语法。使用这个表来确定你的C函数原型应该使用的语法。

返回类型 C函数原型 遗留代码工具功能规范
无返回值 空白myfunction(…) 空白myfunction(…)
标量值 int=myfunction(…) int16 y1=myfunction(…)

函数名

指定的函数名必须与现有的C函数名相同。

例如,考虑下面的C函数原型:

浮动doubleIt (inVal浮动);

在这种情况下,旧代码工具函数规范中的函数名必须为加倍

不应指定C宏的名称。如果必须指定,请设置字段Options.isMacro符合事实的在启用表达式折叠的情况下。

论证规范

参数规范定义了一个或多个数据类型和标记对,它们表示现有C函数的输入、输出、参数和工作向量参数。函数输入和输出参数映射到块输入和输出端口,参数映射到工作区参数。

参数类型参数标记
参数类型 中列出的数据类型万博1manbetx支持的数据类型
参数标记 下列形式之一的令牌:
  • 输入-u1u2...un哪里n是输入参数的总数

  • 输出 -y1y2...yn哪里n是输出参数的总数

  • 参数-p1p2...pn哪里n是参数参数的总数

  • 工作向量(持久记忆)工作1工作2...工作n哪里n是工作向量参数的总数

如果函数没有参数,可以省略参数规范或将其指定为无效的

考虑下面的C函数原型:

浮POWERIT(浮点inVal,INT指数);

要生成在每个时间步骤调用前一个函数的s函数,请设置Legacy Code Tool数据结构字段OutputFcnSpec对下列事项:

‘单y1=powerIt(单u1,int16 p1)’

使用这个功能规范,遗留代码工具映射以下信息。

返回值或参数 C型 令牌 数据类型
返回值 浮动 y1 仅有一个的
无效 浮动 u1 仅有一个的
指数 int p1 int16

如果您的函数需要具有多个输入和输出端口的Simulink万博1manbetx S-function块,请使用唯一编号的函数参数映射到输入端口u令牌。对于输出端口,使用唯一编号y令牌。这些参数在前面的参数规范表中描述。例如,考虑下面的C函数原型:

void myfunc(双*y2,双u2,双u3,双u1,双*y1);

一个OutputFcnSpec将参数映射到输入和输出端口的字符向量看起来类似于以下内容:

'void myfunc(double y2[1], double u2, double u3, double u1, double y1[1])'

得到的s函数块包括三个输入端口和两个输出端口。第一个输入映射到函数参数u1,第二个输入为u2,第三个输入是u3. 对于输出端口,函数参数Y1 [1]映射到第一个输出和参数Y2 [1]映射到第二个输出。有关将函数原型映射到多个输入和输出端口的另一个示例,请参见使用带有结构参数的遗留函数的总线

下表显示了integer类型参数的有效函数规范语法。使用该表确定并调整应用于C函数原型的语法。

参数类型 C函数原型 遗留代码工具功能规范
输入参数
没有争论 功能(无效) 功能(无效)
标量传递值 函数(int-in1) 功能(int16 u1)
标量传递指针 函数(INT * IN1) 函数(int16 u1 [1])
固定向量 函数(int in1[10])
函数(INT * IN1)
函数(int16 u1 [10])
可变矢量 函数(int in1[])
函数(INT * IN1)
函数(int16 u1[]
固定的矩阵 函数(int in1[15])
函数(int in1[])
函数(INT * IN1)
函数(INT16 U1 [3] [5])
变量矩阵 函数(int in1[])
函数(INT * IN1)
函数(int16 u1[]
输出参数
标量指针 函数(int*y1) 函数(int16 y1[1])
固定向量 函数(int y₁[10])
函数(int*y1)
函数(int16 y1[10])
固定的矩阵 函数(int y1[15])
函数(int y1[])
函数(int*y1)
函数(int16 y1 [3] [5])
参数参数
标量传递值 功能(int p1) 函数(int16 p1)
标量传递指针 函数(int*p1) 函数(INT16 P1 [1])
固定向量 函数(中间体P1 [10])
函数(int*p1)
函数(int16 p1 [10])
可变矢量 函数(int p1[])
函数(int*p1)
函数(int16 p1 [])
固定的矩阵 函数(int p1[15])
函数(int p1[])
函数(int*p1)
函数(int16 p1[3][5])
变量矩阵 函数(int p1[])
函数(int*p1)
函数(int16 p1[][])
工作向量参数
按值传递的标量 函数(int work1) 函数(INT16 WORK1)
标量指针 函数(INT * WORK1)
函数(void * work1)
功能(无效**工作1)
函数(int16工作1[1])
void函数(void*work1)
作废功能(作废**工作1)
固定向量 函数(int work1[10])
函数(INT * WORK1)
函数(int16工作1[10])
固定的矩阵 函数(int work1[15])
函数(int work1[]
函数(INT * WORK1)
函数(int16工作1[3][5])

万博1manbetx支持的数据类型

数据类型 万博1manbetx是否支持输入和输出? 万博1manbetx支持参数? 万博1manbetx支持工作向量?
数据类型支持的Simu万博1manbetxlink万博1manbetx(有例外一串
万博1manbetxSimulink.Bus1
一系列万博1manbetxSimulink.Bus2
万博1manbetxSimulink.NumericType3.
万博1manbetxSimulink.AliasType1
枚举1
定点4
Fi对象 不适用 不适用
复数5
1-d阵列
二维阵列6
一天的数组7
空虚*
空虚**
  1. 您必须提供定义总线结构的头文件,定义枚举类型,或定义与别名同名的数据类型。头文件中声明的总线结构必须与总线对象的结构匹配(例如,元素的数量和顺序、数据类型和元素的宽度等)。有关示例,请参阅使用带有结构参数的遗留函数的总线

    要生成与C代码定义的自定义数据类型对应的数据类型对象和枚举类,请使用万博1manbetxSimulink.ImportTexternalTypes功能。

  2. 总线元素可能很复杂,但只有使用Simulink内置的数据类型时才会这样。万博1manbetx还支持将数组嵌套到任何级别。万博1manbetx

  3. 只有当数字数据类型也是别名时,才必须提供定义数据类型的头文件。

  4. 您必须将数据声明为万博1manbetxSimulink.NumericType对象(不支持未指定的伸缩)。万博1manbetx有关示例,请参见传统函数中的定点信号定点参数在传统功能

  5. 仅限于与Simulink内置数据类型一起万博1manbetx使用。要指定复杂数据类型,请将内置数据类型括在尖括号内(<>)并在单词前面复杂的(例如,复合)。对于一个示例,请参见在传统功能复杂的信号

  6. MATLAB, Simu万博1manbetxlink,和万博1manbetxSimulink编码器s manbetx 845产品以列主数据格式存储多维数组数据作为向量。如果您的外部函数代码是为行主数据编写的,请使用ConvertndarayTorowMajor中的S函数选项旧式代码

  7. 对于多维信号,可以使用大小函数用于确定信号中元素的数量。有关示例,请参见在传统功能实现的查找表遗留函数中的多维信号

有关更多信息,请参见数据类型支持的Simu万博1manbetxlink万博1manbetx

遗留代码工具功能规范规则

产品规格旧式代码必须遵守以下规则:

  • 如果参数不是标量,则必须通过引用传递参数。

  • 输入、输出、参数和工作向量参数标记的编号必须从1开始,并单调递增。

  • 对于给定的遗留代码工具数据结构,输入、输出、参数和工作向量参数的数据类型和大小在函数规范中必须相同StartFcnSpec初始化条件sfcnspecOutputFcnSpecTerminateFcnSpec

  • 可以使用使用以下表达式指定参数维度:

    • 功能:numel大小

    • 参数值

    • 操作员:+-/

    • 整数和浮点字面值

    • 括号分组子表达式

    例如:

    def.OutputFcnSpec= foo4(int8 p1[], int8 u1[], double y1[numel(u1)+2][numel(u1)+3],…int32(元素个数(p1) +元素个数(u1)) * 2 +大小(2)日元)”;

遗留C函数规则

要使用遗留代码工具集成C函数,该函数必须遵守以下规则:

  • 函数不能更改输入参数的值。如果输入信号是传递给函数的引用参数,则函数不得修改该参数指向的数据。

  • 该函数的返回值不能是一个指针。

  • 功能规格,可以定义StartFcnSpec初始化条件sfcnspecTerminateFcnSpec不能访问的输入或输出参数。为了StartFcnSpec初始化条件sfcnspec,如果选择S功能选项,则可以访问输出端口输出条件写入被设置为符合事实的。通过此选项设置,生成的S函数指定与每个输出端口关联的内存不能被覆盖,并且是全局的(SS_NOT_REUSABLE_AND_GLOBAL)。

生成和编译的S-功能

为现有C函数注册旧代码工具数据结构后,使用旧式代码函数来生成、编译和链接s函数。

  1. 基于结构中定义的信息生成C MEX s -函数。调用旧式代码“sfcn\u cmex\u生成”作为第一个参数,数据结构的名称作为第二个参数。

    遗留代码(“sfcn\U cmex\U生成”,lct\U规范);
  2. 编译和链接S-功能。此步骤假设一个C编译器为您的MATLAB安装。调用旧式代码“编译”作为第一个参数,数据结构的名称作为第二个参数。

    遗留代码(“编译”,lct\U规范);

    类似于以下内容的信息性消息出现在MATLAB命令窗口和可动态加载的可执行结果中。在32位Windows系统上,Simulink软件为文件命名万博1manbetxex_sfun_doubleit.mexw32

    ###开始编译ex_sfun_doubleit mex ex_sfun_doubleit.c -Id:\work\lct\lct_demos ###完成编译ex_sfun_doubleit ###退出

方便的是,您可以通过调用s函数来在单个步骤中生成、编译和链接s函数旧式代码用字符向量“为sim卡生成sim卡”。如果Options.useTlcWithAccelLegacy Code Tool数据结构的字段设置为1。

一旦您生成了一个可动态加载的可执行文件,您或其他人可以通过添加指定已编译S-Function的S-Function块来在模型中使用它。

生成屏蔽S函数块以调用生成的S函数

您可以选择使用遗留代码工具生成屏蔽S函数块(图形表示),该块配置为调用生成的C MEX S函数。要生成这样的块,请调用旧式代码“slblock_generate”作为第一个参数,旧代码工具数据结构的名称作为第二个参数。

legacy_code( 'slblock_generate',lct_spec);

该工具遮罩该块,以便显示该块的值OutputFcnSpec字段。然后您可以手动将块添加到模型中。

如果您希望遗留代码工具自动将块添加到模型中,请指定模型的名称作为第三个参数。例如:

遗留_代码('slblock_generate',lct_spec',myModel');

如果指定的型号(例如,myModel)存在,旧式代码打开模型并添加由旧代码工具数据结构描述的屏蔽S功能块。如果模型不存在,该函数将使用指定名称创建新模型并添加屏蔽S功能块。

强迫万博1manbetx加速器使用S函数TLC内联代码的模式

如果您正在使用万博1manbetxSimulink加速器™模式下,您可以为遗留代码工具生成的s函数生成并强制使用TLC内联代码。要做到这一点:

  1. 生成TLC块文件通过调用旧式代码作用于'sfcn_tlc_generate'作为第一个参数,旧代码工具数据结构的名称作为第二个参数。

    legacy_code (sfcn_tlc_generate, lct_spec);

    考虑一下使用遗留代码工具将C函数集成到Simulink模型中万博1manbetx.为了产生用于在该实施例的端部所示的模型中的TLC文件,输入以下命令:

    遗留_代码('sfcn_tlc_generate',def);
  2. 强制加速器模式使用TLC文件,方法是使用ssSetOptionsSimStruct功能设置S-功能选项SS\U选项\u使用\u TLC\u和\u加速器

调用遗留C++函数

到初始化传统代码工具数据结构后调用一个旧的C ++函数,值“C ++”分配给选项.语言字段。例如,

DEF = legacy_code( '初始化');def.Options.language = 'C ++';

要验证新设置,请输入

def.Options.language

请注意

遗留代码工具可以与C++函数进行交互,但不能与C++对象进行接口。有关变通方法,请参见遗留代码工具限制在Simuli万博1manbetxnk文档。

处理多个注册文件

您可以在同一文件夹中有多个注册文件,并通过对的单个调用为每个文件生成一个S函数旧式代码。同样,您也可以使用单个呼叫旧式代码以便编译和链接s函数和另一个生成相应的TLC块文件,如果合适的话。

考虑下面的示例lct_register_1lct_register_2lct_register_3每个都创建和初始化遗留代码工具结构的字段。

defs1 = lct_register_1;defs2 = lct_register_2;defs3 = lct_register_3;DEFS = [defs1(:); defs2(:); defs3(:)];

然后,您可以使用以下调用序列旧式代码为了生成基于这三个注册文件的文件:

遗留代码(“sfcn\U cmex\U生成”,defs);遗留_代码(“编译”,定义);遗留代码(“sfcn\U tlc\U生成”,defs);

或者,你可以分别处理每个注册文件。例如:

defs1 = lct_register1;legacy_code( 'sfcn_cmex_generate',defs1);legacy_code( '编译',defs1);legacy_code( 'sfcn_tlc_generate',defs1);...defs2 = lct_register2;legacy_code( 'sfcn_cmex_generate',defs2);legacy_code( '编译',defs2); legacy_code('sfcn_tlc_generate', defs2); . . . defs3 = lct_register3; legacy_code('sfcn_cmex_generate', defs3); legacy_code('compile', defs3); legacy_code('sfcn_tlc_generate', defs3);

部署生成的S函数

您可以部署使用遗留代码工具生成的S函数供其他人使用。若要部署仅用于模拟的S函数,只需共享已编译的可动态加载的可执行文件。

遗留代码工具示例

有关遗留代码工具的示例,请参见使用遗留代码工具实现算法

遗留代码工具限制

代码继承工具

  • 生成C++或C++中现有函数的C MEX S函数,该工具不支持MATLAB或FORTRAN函数的变换。万博1manbetx

  • 可以与C++函数接口,但不可以C++对象。解决这个限制的一种方法是使用S-函数生成器生成S函数的shell,然后从S函数调用传统的C++代码。计算输出回调函数。

  • 不支持模拟连续或不万博1manbetx连续的状态。这可以防止使用mdlUpdateMDL激励回调函数。如果您的应用程序需要此支持,请参阅万博1manbetx使用s -函数构建器合并遗留代码

  • 总是设置S-functions标志直接引线大小。DirFeedthrough)到符合事实的.由于此设置和前面的限制,生成的S函数无法中断代数循环

  • 万博1manbetx只支持连续的,而是固定在较小的时间步长,采样时间和偏移量选项

  • 万博1manbetx支持复数,但仅适用于Simulink万博1manbetx内置数据类型

  • 不支持使用函数指针万博1manbetx作为传统功能的输出被调用。

  • 不支持以下S-fu万博1manbetxnction特性:

    • 工作向量,而非常规工作向量

    • 基于帧的输入和输出信号

    • 出口样品时间

    • 基于多块的采样时间

  • 不支持使用范围(:万博1manbetx:)运算符来访问C++类数据和方法。对于静态方法,可以编写简单的预处理器宏(类似于以下内容)来解决此问题:

    #定义CCommon_computeVectorDotProduct CCommon :: computeVectorDotProduct

  • 可以生成终止功能,当你没有指定一个如果函数规范包括具有属性的Simulink数据类型万博1manbetx头饰。对于导出函数模型,此终止函数会使生成的S函数与代码生成不兼容。