你可以将新的或现有的C代码集成到模型金宝app®使用C调用者块。在仿真软件模型,创建自定义块金宝appC调用者块允许您调用外部C函数中指定外部源代码和库。的优点C调用者块:
自动化集成简单的C函数
集成金宝app仿真软件覆盖™,金宝app仿真软件测试™,金宝app仿真软件设计校验™
集成金宝app仿真软件编码器™
的C调用者块和C函数块允许您将C算法引入模型。金宝app动态系统模型,使用s函数生成器代替。接下来的步骤描述工作流C代码集成到仿真软件使用金宝appC调用者块。
请注意
C99标准版本的C语言支持自定义C代码集成到模型。金宝app金宝app
指定您的外部源代码文件,其中包含您的C函数。
从仿真软件金宝app将来发布,打开配置参数。
在左侧窗格中,选择模拟目标。
使C调用解析的代码块,确保导入自定义代码框被选中。
目录和文件路径可以绝对和相对文件路径模型目录或当前工作目录。看到指定自定义代码相对路径(Stateflow)。
选择头文件并输入你的头文件的名称# include
标签。
提示
在你进入信息源文件在下一步中,你可以点击自动从源文件头文件名自动填充,使用你的源文件中包含的信息。
下额外的构建信息中,选择源文件并输入源文件的路径和名称。如果模型和源文件在不同的目录,输入包含源文件的目录之前的文件名。
选择包括目录输入文件夹额外的构建信息,如头文件,存储。
验证您的自定义代码可以被解析并建立成功,点击验证。
请注意
如果你的头文件中声明一个函数,而是你的源文件不定义函数,默认情况下,函数是不可见的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默认的函数数组布局。
选择一组布局选项默认的函数数组布局。
如果你需要应用特定的阵列布局的一些功能代码,点击异常的函数选择这些功能。
点击应用接受您的更改。
如果你的C函数只接受标量和/或向量输入默认的函数数组布局设置没有影响。
你可以开始定制C代码集成到模型通过输入金宝appC调用者
仿真软件的画布金宝app。或者,拖C调用者块的用户定义函数库到画布上。双击块打开参数对话框中看到你的函数的名称和端口规范。
点击刷新按钮进口源代码及其依赖项。
显示你的C函数函数名。如果你不能看到你的完整列表的功能,点击再输入你的源代码。
查看函数定义的源文件,单击。所选函数的源代码显示在MATLAB中®编辑器。如果源代码不可用,函数声明头文件中显示出来。
改变源文件及其依赖关系,或定义和选择功能阵列布局,单击自定义代码设置按钮打开模拟目标面板模型配置参数。
你可以从你的源代码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模型范围 |
---|---|
函数返回 |
|
|
输入 ,参数 ,常数 |
|
输入输出 (默认),输出 ,输入 ,参数 |
|
|
使用输入输出
端口映射的输入通过一个指针在您的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模型范围 | 金宝app仿真软件端口标签 |
---|---|
|
端口名称 |
输入输出 |
端口名称的输入和输出端口 |
全球 |
端口名和全局变量名 |
|
参数名称 |
|
恒定值的表达式。 例如,大小表达式使用输入参数名称 |
类型——展示了模型之间的匹配数据类型和C函数参数的数据类型。金宝app
C参数数据类型 | 金宝app模型数据类型 |
---|---|
签署了字符 | int8 |
无符号字符 | uint8 |
字符 | int8或uint8,取决于编译器 |
int* | int32 |
无符号整型* | uint32 |
短* | int16 |
长* | int32或fixdt(64,0),这取决于操作系统 |
浮动 | 单 |
双 | 双 |
int8_t* | int8 |
uint8_t* | uint8 |
int16_t* | int16 |
uint16_t* | uint16 |
int32_t* | int32 |
uint32_t* | uint32 |
typedef struct {…} AStruct* * | 总线:AStruct |
typedef enum {. .}AnEnum* * | 枚举:AnEnum |
*如果C调用者int16_t需要一个整数类型,例如,您可以修改它以定点类型匹配的基本类型,例如fixdt(1, 16日,3)。 * *的C调用者同步按钮提示您进口结构或枚举类型使用一个C函数仿真软件总线和枚举类型。金宝app |
大小——指定维度的数据参数。
C参数维度 | 金宝app仿真软件端口尺寸 |
---|---|
|
标量(1) |
|
(1)继承(默认) 如果参数是一个输出端口,应该指定大小。一个输出端口的大小不能被继承。 |
|
(1)继承(默认) 如果参数是一个 全局变量,大小是标量(1)。 |
|
大小是[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函数输入变量的声明。的InputArgument
和ReturnArgument
创建一个属性FunctionArgument
对象,您可以进一步根据定义的规则编辑其属性端口规范表上面。你可以看到FunctionPortSpecification
要学习更多的知识。
在修改全局参数C调用者块,创建一个句柄GlobalArguments
对象使用getGlobalArg
和修改它的属性。
建议创建一个库模型组你C调用者组织块和保持你的模型。你也可以链接的数据字典库代码中定义的自定义类型。使用库模型特别有用,当你有多个模型或模型参考层次结构使用定制的C代码。
打开一个新库模型。在模拟选项卡上,选择新>图书馆。
在建模选项卡,在设计,点击模拟自定义代码。
选择C
或c++
在语言选择,根据您的代码,并确保导入自定义代码框被选中。
按照说明在指定源代码和依赖关系添加你的源文件和它们的依赖项。
创建C调用者块调用C函数。
插入一块从图书馆模型仿真软件模型,只需拖动块到你的模型。金宝app
您还可以创建一个图书馆C调用者使用仿真软件从您的自定义代码代码块进口国。金宝app看到导入自定义C / c++代码使用仿真软件代码进口国金宝app。
将外部调试器附加到MATLAB过程,外部C代码和调试,确保模型配置参数模拟自定义代码在一个单独的过程清除,然后生成调试符号使用:
清晰的墨西哥人金宝appSimulink.CustomCode.debugSymbols (“上”)
MATLAB.exe
。在外部C代码中设置断点使用外部调试器,当你模拟模型应该停在断点。
关闭此设置使用:
金宝appSimulink.CustomCode.debugSymbols (“关闭”)
的C调用者金宝app支持代码生成。在生成的代码从你的模型中,每一个执行C调用者块对应于外部调用C函数与块相关联。为了构建生成的代码代码生成>自定义代码面板模型的配置参数必须填充正确的信息自定义代码。看到模型配置参数:代码生成自定义代码(金宝app仿真软件编码器)。
当模拟模型包含自定义的C或c++代码,您可以选择运行一个单独的进程中的自定义代码之外的MATLAB。这个选项可能是有用的在调试时您的自定义代码。通过运行在一个单独的过程,问题自定义代码不导致MATLAB崩溃,你可以更容易调试和解决这些问题。问题可能出现由于意想不到的异常自定义代码和错误之间的界面模型和自定义代码。金宝app
要启用这个选项,在模型配置参数模拟目标窗格中,选择模拟自定义代码在一个单独的过程。选择适用于自定义C / c++代码集成到您的模型使用任何这些块:
C调用者
C函数
MATLAB函数
MATLAB系统
Stateflow®图表
例如,该模型包含了一个C调用块调用函数加法器()
,访问一个对象调用adderObj
。在调用函数之前,必须创建对象,可以通过调用完成initAdder ()
从初始化函数的模拟目标面板模型的配置参数。
如果initAdder ()
之前不叫加法器()
,然后加法器()
试图访问未初始化的指针,导致运行时异常。如果模拟自定义代码在一个单独的过程参数不是被选中,这个异常可能导致MATLAB模拟模型时崩溃。但是,如果参数被选中时,在仿真软件模拟模型产生一条错误消息。金宝app
然后您可以单击开放启动外部调试器和解决问题导致错误。
调试器启动后,它将重新启动模拟和自动停在自定义函数条目的断点。
一旦完全调试您的自定义代码,你可以明确的模拟自定义代码在一个单独的过程更快的仿真时间。
全局变量——全局变量作为函数输入输出不支持多维数组。金宝app
初始化/终止自定义代码设置——如果你需要为您的自定义代码分配和释放内存,插入的分配和释放初始化函数和终止函数字段的自定义代码设置,或者使用C函数块。
复杂的数据支持金宝app- - -C调用者块在仿真软件不支持复杂的数据类金宝app型。金宝app
变量参数- C不支持的可变参数,例如,金宝appint sprintf (char * str, const char *格式,…)
。
c++语法- - -C调用者块并不直接支持本机c++语法。金宝app你需要写一个C函数包装器和c++代码接口。
测试模型,包括C调用者块,看到测试集成的C代码(金宝app仿真软件测试)。
请注意
如果一个模型自定义代码,更新模型或运行后,slprj
文件夹可能被锁定由于加载自定义代码模拟可执行文件。文件夹不能删除时锁定。卸载可执行文件并打开slprj
文件夹,使用清晰的墨西哥人
命令。看到清晰的
。