主要内容

使用C呼叫者

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

  • 自动集成简单的C函数

  • 与之集成金宝app模拟链路覆盖™金宝app仿真软件测试™,金宝appSimulink Design Verifier™

  • 与之集成金宝appSimulink Coder™

C呼叫者街区和C函数块允许您将C算法引入Simulink。要对动态系统建模,请使用金宝apps函数生成器代替。方法将C代码集成到Simulink中的工作流金宝appC呼叫者块。

笔记

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

指定源代码和依赖项

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

  1. 从Simu金宝applink工具条,打开配置参数

  2. 在左侧窗格中,选择仿真目标

  3. 要启用C调用程序块的代码解析,请确保导入自定义代码盒子被选中。

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

  4. 选择头文件然后输入头文件的名称#包括标签。

    提示

    输入信息后源文件在下一步中,您可以单击自动填充源文件要自动填充标题文件名,请使用源文件中包含的信息。

  5. 在下面其他构建信息中,选择源文件并输入源文件的路径和名称。如果模型和源文件在不同的目录中,请在文件名之前输入包含源文件的目录。

  6. 选择包含目录,并输入存储附加构建信息(如头文件)的文件夹。

    要验证您的自定义代码是否可以成功解析和构建,请单击验证

笔记

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

笔记

用A.C呼叫者块中的块对于每个子系统或具有连续采样时间,或者为了优化块在条件输入分支执行中的使用,块调用的自定义代码函数必须是确定性的,即始终为相同的输入生成相同的输出。通过使用确定性功能通过功能指定参数在仿真目标窗玻璃有关条件输入分支执行示例,请参见将C调用程序块与条件执行一起使用

一天数组处理

金宝appSimulink可以将N-D数组数据传递给中的自定义代码函数C呼叫者块,并从这些块接收数据。执行此操作时,必须指定正确的阵列布局以达到预期效果。看见默认函数数组布局功能异常. 有关使用数组数据的示例,请参见C呼叫者块,看到在Simulink中引入自定义图像过滤算法作为可重用块金宝app使用C调用块调用遗留查询表函数

您可以指定在C函数中如何处理矩阵数据的顺序。传递给C函数和从C函数传递的矩阵数据在必要时转换为指定的数组布局。如果没有指定数组布局,矩阵数据将以与您的Simulink数据相同的顺序通过C函数,并且可能由于行-列之间的主要分歧而发生计算错误。金宝app确保所有Simulink数据都遵循相同的默认函数数组布局。金宝app

  • 列为主- C函数以列主要订单处理输入数组数据。假设您有一个3×3矩阵。在C函数中,此序列访问此矩阵:第一列,第二列和第三列。

  • -C函数按行的主要顺序处理输入数组数据。假设你有一个3乘3的矩阵。在C函数中,该矩阵按以下顺序访问:第一行、第二行和第三行。

  • 任何- C功能对输入阵列数据的布局无动于衷。例如,如果函数仅对数据执行元素明智的操作,则这将是这种情况。

  • 未指定-C函数不假设输入数组数据的布局。与任何设置时,只能在列主设置中生成代码。试图在行主集设置中生成代码将产生错误。看阵列布局(金宝appSimulink编码器).只有在需要与旧型号兼容时才选择此选项。

要了解有关Simulink中的Row-Major和列主要数组布局的更多信息,请参阅金宝app默认函数数组布局

  1. 选择下面的阵列布局选项默认函数数组布局

  2. 如果需要对代码中的一些函数应用特定的数组布局,请单击功能异常来选择这些功能。

  3. 点击申请接受你的变化。

如果您的C函数只接受标量和/或向量输入,则默认函数数组布局设置没有效果。

呼叫C呼叫者阻止并指定端口

您可以通过键入以下命令开始将您的定制C代码集成到Simulink中金宝appC呼叫者在Simuli金宝appnk画布中。或者,拖C呼叫者从用户定义的函数库块到画布上。双击块以打开“块参数”对话框,以查看功能和端口规范的名称。

  1. 单击Refresh按钮以导入源代码及其依赖项。

  2. C函数显示在函数名.如果没有看到您的完整功能列表,请单击刷新按钮重新导入源代码。

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

  4. 要更改源文件及其依赖项,或要定义和选择函数数组布局,请单击“自定义代码设置”按钮打开仿真目标窗格中的模型配置参数。

将C函数参数映射到金宝app港口

控件可以将C函数参数从源代码映射到Simulink端口金宝app端口规格表中C呼叫者块并通过创建functionPortSpecification.对象。在源代码中,头文件包括要连接到Simulink端口的C函数参数。金宝app

extern void mean_filter(const unsigned char* src, unsigned char* dst, unsigned int width, unsigned int height, unsigned int filterSize);

端口规格显示您的参数的详细信息以及它们如何连接到您的C呼叫者块模型。金宝app

名称- 指定输入和输出参数的名称。名称是在源代码中的C函数中定义的函数参数或参数名。本栏仅供参考。

范围-指定C函数参数如何映射到Simulink范围。参数的默认作用域取决于函数定义,您可以根据源代码金宝app中的函数定义更改作用域。

金宝appsimulink范围 块映射的范围
输入 块的输入端口
输出 块输出端口
输入输出 块输入和输出端口
全球的 块使用的全局变量
范围 块可调参数
常数 定值

对于指针传递的参数,当您有一个常量限定符定义,如const双u *时,参数只能是输入或参数。当没有常量限定符时,参数为输入输出默认情况下,您可以将其更改为an输入输出范围范围。在……的情况下输入范围作用域,确保C函数不会修改指针所指向的内存。如果参数是输出范围,应在每个呼叫中​​重新分配所指向该指针的每个元素。

C参数

金宝appsimulink范围

函数返回

输出

双u

输入范围常数

双u *

双u []

双u [] [2]

双u [2] [3]

输入输出(默认),输出输入范围

const双u *

const双u []

const双u [] [2]

const双u [2] [3]

输入(默认),范围

使用输入输出端口映射C函数中通过指针传递的输入。使用输入输出输入端口和输出端口的名称相同。输入输出端口可以​​重用用于输入和输出端口的缓冲区。这可以优化根据信号大小和块布局的存储器使用。

将C函数参数映射到输入输出端口,在函数定义中将变量定义为指针。

extern void平均值_filter(未签名的char * src,unsigned int宽度,无符号int height,unsigned int filtersize);

然后,选择要安装的端口规格输入输出中的范围端口规范表,并将结果函数输出赋给自定义函数中的输入变量。

您可以在自定义代码中使用全局变量,将它们映射到适当的Simulink范围。要启用在模型中使用全局变量,请选择金宝app使全局变量能够作为函数接口模型设置>配置参数>仿真目标.您可以将全局变量映射到输入输出输入输出全球的上的范围C呼叫者块。这些作用域的可用性取决于自定义代码中全局变量的使用。

一种全球的作用域使您能够在自定义代码和C呼叫者块,并允许在块上计算期间使用全局变量。值转移使用全球的范围在块接口上不可见。此表显示了示例代码段及其默认端口和可用端口。

示例代码 金宝appsimulink范围

双重数据;void foo(void){int temp=data;}

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

输入(默认)

全球的

双数据;void bar(void){data = 0;}

数据被写入全局变量。可用范围是:

输出(默认)

全球的

输入输出

双数据;Void foo2(Void) {data = data + 1;}

在全局变量上读取和写入数据。可用范围包括:

全球的(默认)

输入输出

输出

标签- 表示Simulink块中相应参数的标签。金宝app默认情况下,除非您更改它,否则您的参数标签与参数名称相同。

金宝appsimulink范围 金宝appSimulink端口标签

输入输出

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

范围

参数名称

常数

常量值的表达式。

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

类型- 演示Simulink数据类型与C函数参数数据类型之间的匹配。金宝app

C参数数据类型 金宝app模型数据类型
签署了字符 int8
无符号字符 uint8
字符 Int8或uint8,这取决于编译器
* int32
无符号整型* uint32
* int16
长的* INT32或FIXDT(1,64,0),具体取决于操作系统
浮动 仅有一个的
int8\u t* int8
uint8\u t* uint8
int16_t* int16
uint16_t* uint16
int32_t* int32
uint32\u t* uint32
typedef struct {...} astruct** 公共汽车:Astruct.
typedef枚举{..} anenum** 枚举:AnEnum

*如果C呼叫者采用整数类型,例如int16_t,您可以将其修改为具有匹配基本类型的固定点类型,例如fixdt(1,16,3)。

* *的C呼叫者sync按钮提示您导入C函数使用的结构或枚举类型作为Simulink总线和枚举类型。金宝app

尺寸-指定参数中的数据维度。

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

双u

标量(1)

双u []

双u [] [2]

(1)继承(默认)

如果参数是用于输出端口,则应该指定大小。输出端口的大小不能被继承。

双u *

(1)继承(默认)

如果论据是支持输入输出端口,即使尺寸也无法继承输出端口可以​​继承。

对于全局变量,size是标量(1)。

双u [2] [3]

大小是[2,3]。

创建一个functionPortSpecification.对象和编辑C呼叫者块的属性

改变端口规范表属性,您可以创建functionPortSpecification.对象并修改其属性。创建一个functionPortSpecification.选定的对象C呼叫者块,在命令行中输入:

myCCallerConfigObj = get_param (gcb),“功能端口规范”
myCCallerConfigObj=带有属性的FunctionPortSpecification:CPrototype:'real\u T add(real\u T u1,real\u T u2);'InputArguments:[1×2 Simulink.Cus金宝apptomCode.FunctionArgument]返回参数:[1×1 Simulink.CustomCode.FunctionArguments]全局参数:[1×0 Simulink.CustomCode.FunctionArgument]
C原型属性为只读,并显示C函数输入变量的声明。这Inputargument.返回论点属性创建一个FunctionArgument对象,您可以根据为其定义的规则进一步编辑其属性端口规范表上表。你可以看到functionPortSpecification.了解更多。

修改C呼叫者对象的句柄GlobalArguments物体使用格特环球酒店并修改其属性。

创建自定义C调用者库

建议创建一个库模型来对用户进行分组C呼叫者模块和保持你的模型有组织。还可以将数据字典链接到库,以保存代码中定义的自定义类型。当您有多个模型或使用定制C代码的模型引用层次结构时,使用库模型特别有用。

  1. 开启一个新的图书馆模式。在模拟选项卡上,选择>图书馆

  2. 建模标签,下面设计,点击模拟自定义代码

  3. 选择CC ++选项,具体取决于您的代码,并确保导入自定义代码盒子被选中。

  4. 请按照指定源代码和依赖项添加源文件及其依赖项。

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

  6. 要将库模型插入模型到Simulink模型,只需将块拖到模型中。金宝app

您还可以创建一个C呼叫者使用Simulink代码导入程序从您的自定义代码中块。金宝app看使用Simulink代码导入器导入自定义C/ c++代码金宝app

为自定义代码生成调试符号

要将外部调试器附加到MATLAB进程,并调试外部C代码,请确保模型配置参数在单独的进程中模拟自定义代码清除,然后使用以下命令生成调试符号:

清除墨西哥人金宝appSimulink.CustomCode.debugSymbols ('在'
打开此设置并更新模型后,生成调试符号,您可以通过将进程附加到Matlab进程附加外部调试器matlab.exe..使用外部调试器设置外部C代码中的断点,当您模拟模型时,它应该停止断点。

使用以下方式打开此设置:

金宝appSimulink.CustomCode.debugSymbols (“关闭”

从模型生成代码

C呼叫者金宝app支持代码生成。在从模型生成的代码中,每个C呼叫者block对应于调用与该block相关联的外部C函数。为了构建生成的代码,代码生成>自定义代码“模型配置参数”的窗格中必须填充与自定义代码有关的正确信息。看模型配置参数:代码生成自定义代码(金宝appSimulink编码器)

在单独的进程中模拟自定义代码

在模拟包含自定义C或C ++代码的模型时,您可以选择在MATLAB之外的单独进程中运行自定义代码。调试自定义代码时,此选项可能很有用。通过在一个单独的进程中运行,自定义代码问题不会导致MATLAB死机,你可以更容易调试和解决这些问题。由于Simulink与自定义代码之间的接口中的自定义代码或错误中的意外异常,可能会出现问题。金宝app

要启用此选项,在模型配置参数中,在仿真目标窗格中,选择在单独的进程中模拟自定义代码. 该选项适用于使用以下任一块集成到模型中的自定义C/C++代码:

  • C呼叫者

  • C函数

  • MATLAB函数

  • Matlab系统

  • Stateflow®图表

例如,该模型包含一个调用该函数的C调用程序块加法器(),访问一个名为的对象adderObj.在调用函数之前,必须创建对象,这可以通过调用initAdder ()初始化函数仿真目标窗格中的模型配置参数。

如果initAdder ()之前没有被调用加法器(), 然后加法器()尝试访问未初始化的指针,这会导致运行时异常。如果在单独的进程中模拟自定义代码参数未被选中,此异常可能导致MATLAB模拟模型时崩溃。但是,如果选择了参数,模拟模型会在Simulink中产生错误消息。金宝app

然后,您可以单击打开启动外部调试器并解决导致错误的问题。

调试器启动后,它将自动重新启动模拟并停止在自定义功能条目的断点。

一旦您的自定义代码被完全调试,您就可以清除在单独的进程中模拟自定义代码用于更快的模拟时间。

限制

  • 全局变量—作为函数输入输出的全局变量不支持多维数组。金宝app

  • 自定义代码设置的初始化/终止- 如果您需要为自定义代码分配和解析内存,请插入分配和删除初始化函数终止功能字段的自定义代码设置,或使用C函数块。

  • 复杂数据支持金宝app-C呼叫者块在Simulink中不支持复金宝app杂数据类型。金宝app

  • 可变参数- C中不支持变量参数,例如:金宝appintsprintf(字符*str,常量字符*格式,…)

  • c++语法-C呼叫者块不直接支持本机c++语法。金宝app您需要编写一个C函数包装器来与c++代码交互。

测试模型包括C呼叫者块,看到测试集成C代码(金宝appSimulink测试)

笔记

如果模型具有自定义代码,则在更新或运行模型后slprj由于加载了自定义代码模拟可执行文件,文件夹可能被锁定。该文件夹处于锁定状态时,不能被删除。卸载可执行文件并解锁slprj文件夹中,使用清晰的墨西哥人命令。看清除

也可以看看

职能

对象

相关的话题