主要内容

C Caller

Simulink 中集成 C 代码

  • C Caller block

库:
Simulink / User-Defined Functions

描述

C Caller 模块将您的外部 C 代码集成到 Simulink® 中。此模块导入并列出您的外部 C 代码中的函数,并使您能够选择已解析的 C 函数以集成到您的 Simulink 模型中。

使用库浏览器 > Simulink > 用户定义函数C Caller 模块提取到 Simulink 画布上。

然后,点击模块对话框上的 Gear 图标。这将打开配置参数对话框。在配置参数对话框内部,转至仿真目标窗格,并使用代码信息选项卡中的参数来定义源代码和任何支持文件。要浏览源代码中的函数定义,请使用 Go to function button. 图标。有关定义源代码和支持文件的详细信息,请参阅Specify and Configure Custom C/C++ Code

要更改您的源代码和支持文件,请在配置参数对话框中的仿真目标窗格的代码信息选项卡中使用相同的参数。更改源代码和支持文件后,通过点击模块对话框上的 Circular arrow 按钮来刷新函数列表。

示例

限制

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

  • 复数数据支持 - 模块不支持 Simulink 中的复数数据类型。

  • 变量参量 - 不支持 C 语言中的变量参量,例如 int sprintf(char *str, const char *format, ...)

  • C++ 语法 - 模块不直接支持原生 C++ 语法。您需要编写 C 函数包装器来与 C++ 代码对接。

  • Simulink Test™ 观测器支持 - 从 R2026a 开始,您可以在 C Caller 模块中使用 Observer PortObserver Reference 模块来观察导出的全局变量。您无法使用这些模块来观察静态全局变量或 N 维矩阵的全局变量。

端口

输入

全部展开

输入端口数量及其名称通过您的外部 C 代码中的选定函数推断。要向 C Caller 模块提供数据,请将输入信号连接到输入端口。

输入标签与输入端口名称相同,除非通过从模块对话框编辑端口设定下的标签列对其进行了更改。如果您将标签重命名为输入端口,C Caller 模块会更改端口名称。

对于输入变量,您可以使用作用域列将输入作用域更改为参数或常量。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus | string

输出

全部展开

输出端口数量及其名称通过您的外部 C 代码中的选定函数推断。要从您的 C Caller 模块发送数据,请将模块连接到您的 C Caller 模块的输出端口。

输出端口标签与输出端口名称相同,除非您通过从模块对话框编辑端口设定下的标签列对其进行了更改。如果您将标签重命名为输入端口,C Caller 模块会更改端口名称。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | enumerated | bus | string

参数

全部展开

C Caller 模块解析的函数的名称,指定为字符向量或字符串标量。有关可用函数的列表,请参阅可用函数

可调: Yes

编程用法

模块参数FunctionName
类型:字符向量或字符串标量

myFunctionName = get_param(gcb,"FunctionName")
myFunctionName =

    'mean_filter'

端口属性,指定为表。该表指示模块的每个输入和输出元素的属性。如果作用域是输入,您可以将此变量修改为参数常量。这些属性包括

全局参量 - 从 R2026a 开始,您可以使用 C Caller 模块对话框中的按钮从外部自定义代码中添加、删除或自动推断全局变量。要使用这些按钮,请在“配置参数”对话框中选择仿真目标。在导入设置选项卡上,确保未选中自动将全局变量推断为函数接口复选框。

  • 使用 Add 按钮将外部 C 代码中的全局变量添加到模块。使用此按钮,您可以一次添加一个变量。要以编程方式添加全局变量,请使用 addGlobalArg 函数,该函数对 R2024b 或更高版本可用。

  • 使用 Remove 按钮从模块中删除全局变量。要删除一个变量,请从端口设定表中选择该变量对应的行,然后点击该按钮。要一次删除多个变量,请选择与这些变量对应的行,然后使用该按钮。要以编程方式删除全局变量,请使用 deleteGlobalArg 函数,该函数对 R2024b 或更高版本可用。

  • 要一次性添加选定 C 函数使用的所有全局变量,请使用 Magic wand 按钮。

名称 - 演示从源代码推断的变量名称。

粗体参量名称指示端口或参数是全局参量。

作用域 - 指示源代码中变量的角色。如果变量是 C Caller 模块源代码中的输入参量,您可以将作用域类型更改为常量或参数。如果变量是源代码中的输出参量,您无法更改作用域类型。

标签 - 为 Simulink 模型的输入或输出变量加标签。您可以使用此表更改标签。如果作用域是参数,请在此字段中输入参数名称。如果作用域是常量,则输入常量值。

类型 - 指示来自端口的数据类型。

大小 - 指示输入和输出数据的大小。

名称、作用域、类型和大小从您的源代码推断。

编程用法

模块参数FunctionPortSpecification
类型:FunctionPortSpecification 对象

可映射到 C Caller 模块的所有可用函数的列表,指定为元胞数组。

您模型中的 C Caller 模块导入外部源代码中的所有函数,并在模块对话框上的函数名称旁边显示函数名称。要在模块中选择和使用函数,请确认函数名称出现在可用函数表中。如果其中一个函数缺失,请通过点击模块对话框上的 Circular arrow 按钮重新加载源代码。要更改函数名称,请修改您的源代码并点击刷新按钮重新加载。

编程用法

模块参数AvailableFunctions
类型:元胞数组

allAvailableFunctions = get_param(gcb, "AvailableFunctions")
allAvailableFunctions =

  1×1 cell array

    {'add'}

采样周期,以秒为单位指定。请参阅 采样时间的类型指定采样时间

编程用法

模块参数SampleTime
类型:字符串标量或字符向量
默认值"-1"

模块特性

数据类型

Booleana | busa | doublea | enumerateda | fixed pointa | integera | singlea | stringa

直接馈通

多维信号

a

可变大小信号

过零检测

a 实际支持的数据类型或功能取决于模块实施。

详细信息

全部展开

提示

  • 要测试包含 C Caller 模块的模型,请参阅测试集成的 C 代码 (Simulink Test)

  • 如果模型具有自定义代码,则在更新或运行模型后,slprj 文件夹可能会因加载的自定义代码仿真可执行文件而锁定。当文件夹被锁定时,您无法删除它。要卸载可执行文件并解锁 slprj 文件夹,请使用 clear mex 命令。请参阅clear

扩展功能

全部展开

定点转换
使用 Fixed-Point Designer™ 设计和仿真定点系统。

版本历史记录

在 R2018b 中推出

全部展开