主要内容

集成C代码使用C调用者

你可以将新的或现有的C代码集成到模型金宝app®使用C调用者块。在仿真软件模型,创建自定义块金宝appC调用者块允许您调用外部C函数中指定外部源代码和库。的优点C调用者块:

  • 自动化集成下的简单的C函数包括函数定义名称空间

  • 集成金宝app仿真软件覆盖™,金宝app仿真软件测试™,金宝app仿真软件设计校验™

  • 集成金宝app仿真软件编码器™

C调用者块和C函数块允许您将C算法引入模型。金宝app动态系统模型,使用s函数生成器代替。接下来的步骤描述工作流C代码集成到仿真软件使用金宝appC调用者块。

请注意

C99标准版本的C语言支持自定义C代码集成到模型。金宝app金宝app

指定源代码和依赖关系

指定您的外部源代码文件,其中包含您的C函数。

  1. 从仿真软件金宝app将来发布,打开配置参数

  2. 在左侧窗格中,选择模拟目标

  3. 选择包括头信息并输入你的头文件的名称# include标签。

    目录和文件路径可以绝对和相对文件路径模型目录或当前工作目录。看到指定自定义代码相对路径(Stateflow)

    提示

    在你进入信息源文件在下一步中,你可以点击自动从源文件头文件名自动填充,使用你的源文件中包含的信息。

  4. 选择源文件并输入源文件的路径和名称。如果模型和源文件在不同的目录,输入包含源文件的目录之前的文件名。

  5. 选择包括目录输入文件夹额外的构建信息,如头文件,存储。

    验证您的自定义代码可以被解析并建立成功,点击验证

请注意

如果你的头文件中声明一个函数,而是你的源文件不定义函数,默认情况下,函数是不可见的C调用者块对话框。你可以设置未定义的函数处理参数配置参数指定其他行为在这种情况下,包括抛出错误,生成存根函数,或忽视的条件。

请注意

使用一个C调用者块在每个子系统或连续采样时间,或优化使用块在条件输入分支执行,自定义函数的代码块必须是确定的,也就是说,总是产生同样的输出相同的输入。识别哪些定制代码使用的函数是确定的确定的功能指定的功能参数模拟目标窗格。对于有条件的输入分支执行示例,看到的使用C调用块条件执行

一天数组处理

金宝app仿真软件可以通过一天数组数据自定义代码功能C调用者块,和接收数据从这些块。当你这样做时,你必须指定正确的阵列布局来达到预期的结果。看到默认的函数数组布局异常的函数。使用数组数据的例子C调用者块,看到使用自定义图像过滤算法在仿真软件可重用块金宝app使用C调用者调用遗留查找表函数块

您可以指定的顺序矩阵数据是如何处理你的C函数。矩阵数据传递到和从你的C函数转换如果必要您所指定的数组布局。如果没有指定阵列布局,C函数的矩阵数据通过同一订单的模型数据,并计算错误可能发生由于row-column重大分歧。金宝app确保你遵循相同的默认函数数组所有模型数据的布局。金宝app

  • 列为主- C函数处理输入数组中的数据列为主的秩序。假设你有一个3×3的矩阵。C函数,按照下面的顺序访问这个矩阵:第一列,第二列,第三列。

  • - C函数处理输入数组中的数据行顺序。假设你有一个3×3的矩阵。C函数,在这个序列:访问这个矩阵第一行,第二行和第三行。

  • 任何——C函数对输入数组数据的布局。这将是如果,例如,函数执行只element-wise操作数据。

  • 未指定——C函数没有假设输入数组数据的布局。相比任何设置,您可以生成代码只有在列为主的设置。试图在生成代码行设置会产生一个错误。看到阵列布局(金宝app仿真软件编码器)。选择这个选项只有在需要兼容旧的模型。

更多地了解模型的行和列为主的阵列布局,明白了金宝app默认的函数数组布局

  1. 选择一组布局选项默认的函数数组布局

  2. 如果你需要应用特定的阵列布局的一些功能代码,点击异常的函数选择这些功能。

  3. 点击应用接受您的更改。

如果你的C函数只接受标量和/或向量输入默认的函数数组布局设置没有影响。

调用C调用者块和指定端口

你可以开始定制C代码集成到模型通过输入金宝appC调用者仿真软件的画布金宝app。或者,拖C调用者块的用户定义函数库到画布上。双击块打开参数对话框中看到你的函数的名称和端口规范。

  1. 点击刷新按钮进口源代码及其依赖项。

  2. 显示你的C函数函数名。如果你不能看到你的完整列表的功能,点击刷新按钮再输入你的源代码。

  3. 查看函数定义的源文件,单击视图函数定义按钮。所选函数的源代码显示在MATLAB中®编辑器。如果源代码不可用,函数声明头文件中显示出来。

  4. 改变源文件及其依赖关系,或定义和选择功能阵列布局,单击自定义代码设置按钮打开模拟目标面板模型配置参数。

地图C函数参数金宝app港口

你可以从你的源代码C函数参数映射到仿真软件端口使用金宝app端口规范表中C调用者块或通过创建一个FunctionPortSpecification对象通过命令行。在你的源代码,C头文件包括函数参数连接到仿真软件端口。金宝app

外面的空白mean_filter (const unsigned char * src, unsigned char * dst, unsigned int宽度,unsigned int高度,unsigned int filterSize);

端口规范表显示了你的论点的细节以及他们如何连接到你C调用者块模型。金宝app

桌子上有这些列:

的名字

指定输入和输出参数的名称。的名字函数参数或参数名称为C函数从源代码中定义。这个专栏是仅供参考。

范围

指定C函数参数如何映射到模型范围。金宝app你的论点有默认范围取决于函数定义,你可以改变范围取决于你的函数定义的源代码。

金宝app模型范围 范围块映射
输入 块的输入端口
输出 块输出端口
输入输出 块的输入和输出端口
全球 不适用
参数 块可调参数
常数 恒定值

为论证通过指针,当参数恒定限定符定义等const双u *,论点只能输入或参数。当没有常数限定符,是一个的论证输入输出默认情况下,你可以改变它的输入,输出,或参数范围。在的情况下输入参数范围,确保C函数不修改指向的内存的指针。如果参数是一个输出范围,每一个元素指向指针应该重新分配在每个调用的函数。

C参数

金宝app模型范围

函数返回

输出

双u

输入,参数,常数

双u *

双u []

双u [] [2]

双u [2] [3]

输入输出(默认),输出,输入,参数

const双u *

const双u []

const双u [] [2]

const双u [2] [3]

输入(默认),参数

使用输入输出空间映射的输入通过一个指针在您的C函数。端口创建使用一个输入输出范围为输入和输出端口有相同的名称。的输入输出范围使缓冲的输入和输出端口的重用。这可能优化内存使用取决于块信号大小和布局。

一个C函数参数映射到一个输入输出范围,定义变量作为函数的指针。

外面的空白mean_filter (unsigned char * src, unsigned int宽度,unsigned int高度,unsigned int filterSize);

然后设置范围输入输出端口规范表和分配产生的函数输出输入变量的自定义函数。

您可以在您的自定义代码中使用全局变量,将它们映射到适当的模型范围。金宝app启用全局变量的使用在你的模型中,选择启用全局变量作为函数接口模型设置>配置参数>模拟目标。你可以将全局变量映射到一个输入,输出,输入输出全球范围在C调用者块。这些范围的可用性依赖于全局变量的使用在您的自定义代码。

一个全球范围允许您自定义代码和传输数据C调用者块,允许您使用全局变量在计算。值转移使用全球范围块接口是不可见的。这个表显示了示例代码片段和默认和可用的端口。

示例代码 金宝app模型范围

双数据;空白foo (void) {int temp =数据;}

全局变量数据只读取变量数据。可用范围:

输入(默认)

全球

双数据;空白栏(空白){数据= 0;}

数据写入一个全局变量。可用范围:

输出(默认)

全球

输入输出

双数据;空白foo2 (void){数据=数据+ 1;}

数据读取和写在一个全局变量。可用范围:

全球(默认)

输入输出

输出

标签

显示的标签对应的参数模型块中。金宝app默认情况下,你的论点的标签是一样的参数名称,除非你改变它。改变范围端口配置选项标签。

范围 金宝app仿真软件端口标签

输入,输出

端口名称
输入输出 端口名称的输入和输出端口
全球 端口名和全局变量名

参数

参数名称

常数

恒定值的表达式。

例如,大小表达式使用输入参数名称大小(in1, 1)

类型

指定的数据类型参数。数据类型的C函数必须在模型匹配相同的数据类型。金宝app此表显示了支持C数据类型可以使用的金宝appC调用者块,等效模型的数据类型。金宝app

C参数数据类型 金宝app模型数据类型
签署了字符/无符号字符 int8 / unit8
字符 int8或uint8,取决于编译器
int /无符号整型* int32 / unit32
短/无符号短* int16 / unit16
长/无符号长* int32 / uint32或int64 / unit64,这取决于操作系统
长的长/无符号长* int64 / uint64
浮动
int8_t / uint8_t* int8 / uint8
int16_t / unit16_t* int16 / unit16
int32_t / unit32_t* int32 / uint32
int64_t / unit64_t* int64 / uint64
bool 布尔
typedef struct {…} AStruct* * 总线:AStruct
typedef enum {. .}AnEnum* * 枚举:AnEnum

*如果C调用者int16_t需要一个整数类型,例如,您可以修改它以定点类型匹配的基本类型,例如fixdt(1, 16日,3)。

* *的C调用者同步按钮提示您进口结构或枚举类型使用一个C函数仿真软件总线和枚举类型。金宝app

大小

指定数据维度的论点。

C参数维度 金宝app仿真软件端口尺寸

双u

标量(1)

双u []

双u [] [2]

继承(1)(默认)

如果参数是一个输出端口,必须指定其大小和不能被继承,除非参数映射到一个输入输出范围或模型配置参数模拟自定义代码在一个单独的过程被选中。

双u *

继承(1)(默认)

如果参数是一个输出端口,必须指定其大小和不能被继承,除非参数映射到一个输入输出范围或模型配置参数模拟自定义代码在一个单独的过程被选中。

全局变量,大小是标量(1)。

双u [2] [3]

大小是(2、3)

创建一个FunctionPortSpecification对象和编辑C调用者块的属性

改变端口规范表属性以编程方式,您可以创建一个FunctionPortSpecification对象和修改它的属性。创建一个FunctionPortSpecification对象的选择C调用者块在一个模型中,在命令行输入:

myCCallerConfigObj = get_param (gcb),“FunctionPortSpecification”)
myCCallerConfigObj = FunctionPortSpecification属性:CPrototype:“real_T添加(real_T u1, u2乐队real_T);“InputArguments: [1×2 Simulink.CustomCod金宝appe。FunctionArgument] ReturnArgument:(1×1 S金宝appimulink.CustomCode。FunctionArgument] GlobalArguments: [1×0 Simulink.CustomCode.FunctionArgument]
CPrototype属性是只读的,显示了C函数输入变量的声明。的InputArgumentReturnArgument创建一个属性FunctionArgument对象,您可以进一步根据定义的规则编辑其属性端口规范表上面。看到FunctionPortSpecification要学习更多的知识。

在修改全局参数C调用者块,创建一个句柄GlobalArguments对象使用getGlobalArg和修改它的属性。

创建一个定制的C库调用者

建议创建一个库模型组你C调用者组织块和保持你的模型。你也可以链接的数据字典库代码中定义的自定义类型。使用库模型特别有用,当你有多个模型或模型参考层次结构使用定制的C代码。

  1. 打开一个新库模型。在模拟选项卡上,选择>图书馆

  2. 建模选项卡,在设计,点击模拟自定义代码

  3. 选择Cc++语言选择,根据您的代码,并确保导入自定义代码框被选中。

  4. 按照说明在指定源代码和依赖关系添加你的源文件和它们的依赖项。

  5. 创建C调用者块调用C函数。

  6. 插入一块从图书馆模型仿真软件模型,只需拖动块到你的模型。金宝app

您还可以创建一个图书馆C调用者使用仿真软件从您的自定义代码代码块进口国。金宝app看到导入自定义C / c++代码使用仿真软件代码进口国金宝app

调试定制代码

你可以从内部调试代码仿真软件通过推出外部调试器和您的自定义代码中设置断点金宝app。有关更多信息,请参见调试定制的C / c++代码

从模型生成代码

C调用者金宝app支持代码生成。在生成的代码从你的模型中,每一个执行C调用者块对应于外部调用C函数与块相关联。为了构建生成的代码代码生成>自定义代码面板模型的配置参数必须填充正确的信息自定义代码。看到模型配置参数:代码生成自定义代码(金宝app仿真软件编码器)

限制

  • 初始化/终止自定义代码设置——如果你需要为您的自定义代码分配和释放内存,插入的分配和释放初始化函数终止函数字段的自定义代码设置,或者使用C函数块。

  • 复杂的数据支持金宝app- - -C调用者块在仿真软件不支持复杂的数据类金宝app型。金宝app

  • 变量参数- C不支持的可变参数,例如,金宝appint sprintf (char * str, const char *格式,…)

  • c++语法- - -C调用者块并不直接支持本机c++语法。金宝app你需要写一个C函数包装器和c++代码接口。

测试模型,包括C调用者块,看到测试集成的C代码(金宝app仿真软件测试)

请注意

如果一个模型自定义代码,更新模型或运行后,slprj文件夹可能被锁定由于加载自定义代码模拟可执行文件。文件夹不能删除时锁定。卸载可执行文件并打开slprj文件夹,使用清晰的墨西哥人命令。看到清晰的

另请参阅

功能

对象

相关的话题