集成C代码使用C调用者

您可以将新的或现有的C代码集成到Simulink中万博1manbetx®使用C调用者块。要在Simulink模型中创建自定义块,则万博1manbetxC调用者块可以调用外部源代码和库指定的外部的C函数。的优势的C来电块:

  • 简单的C函数自动集成

  • 集成万博1manbetx仿真软件覆盖™,万博1manbetxSimulink的测试™,万博1manbetx仿真软件设计校验™

  • 集成万博1manbetxSimulink的编码器™

C调用者块允许您将C算法引入Simulink。万博1manbetx为动态系统建模,使用S-Function Builder中代替。接下来的步骤描述了工作流程使用到C代码集成到Simulink万博1manbetxC调用者块。

指定源代码和相关性

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

  1. 从Simu万博1manbetxlink的工具条,打开配置参数

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

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

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

  4. 选择头文件,并输入头文件的名称# include标签。

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

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

请注意

如果函数是在头文件中声明,但在源代码中不执行,自动生成一个空存根函数来模拟并编译该模型。

定义默认函数数组布局

您可以指定你的矩阵数据如何存储在Simulink中的顺序。万博1manbetx传入和传出的C函数矩阵数据转换到您指定的默认功能阵列布局。如果未指定函数数组布局,矩阵数据通过传递C调用者在相同的Simulink数据顺序中,可能会出现由于行万博1manbetx和列的主要混乱而导致的计算错误。确保所有Simulink数据都遵循相同的默认函数数组布局。万博1manbetx

  • 列优先- - -C调用者块处理中列主顺序Simuli万博1manbetxnk的数据。假设你有一个3×3的矩阵。在里面C调用者块,该矩阵按以下顺序存储:第一列、第二列和第三列。

  • 行主- - -C调用者块处理的行主顺序Simuli万博1manbetxnk的数据。假设你有一个3×3的矩阵。在里面C调用者块,该矩阵按如下顺序存储:第一行、第二行和第三行。

  • 任何数组数据可以以列主顺序存储,也可以以行主顺序存储C调用者块。因此,您可以同时以列主设置和行主设置生成代码。

  • 未指定-数组数据可以按列主顺序和行主顺序存储。相比任何设置时,你只能生成列专业设置代码。

有关Simulink中的行主数组和列主数组布局的更多信息,请参见万博1manbetx默认函数数组布局

  1. 选择下阵列布局选项默认阵列功能布局

  2. 如果需要将特定数组布局应用于代码中的某些函数,请单击指定的功能来选择这些函数。

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

  4. 点击好吧关闭配置参数

调用C调用者阻塞并指定端口

您可以通过在Simulink画布中输入C Caller来启动自定义的C代码集成到Simulink中。万博1manbetx或者,拖C调用者块的库浏览器>用户定义函数。双击块打开块的参数对话框,以查看函数名称和端口规范。

  1. 点击刷新自定义代码导入你的源代码和它的依赖。

  2. 您的C函数下显示功能名称。如果你不能看到你的功能完整列表,请点击重新导入您的源代码。

  3. 要查看头文件中的函数声明或函数的输入/输出变量,请单击转到函数声明导航源文件。

  4. 要更改源文件及其依赖关系,或定义和选择函数数组布局,请单击自定义代码设置打开模拟目标选项卡中的配置参数。

将C函数参数映射到万博1manbetx端口

方法可以将源代码中的C函数参数映射到Simulink端口万博1manbetx端口规范表中C调用者块和通过创建FunctionPortSpecification通过命令行对象。在源代码中,头文件包括要连接到Simulink端口的C函数参数。万博1manbetx

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

端口规范展示你的论点的细节,以及它们如何与你的论点相联系C调用者块模型。万博1manbetx

参数名称-指定输入和输出参数的名称。参数名称是从源代码在C的功能来定义该函数的参数或参数的名称。此列仅供参考。

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

万博1manbetx模型范围 块映射范围
输入 块输入端口
输出 块输出端口
输入输出 块的输入和输出端口
参数 块可调参数
常数 恒定值

当您有一个常量限定符定义时,例如常量双* U,参数只能是输入或参数。当没有常量限定符时,参数默认是输出,您可以将其更改为输入,输入输出参数范围。在这种情况下,确保C函数不会修改指针所指向的内存。如果参数是输出类型,则该指针指向的每个元素都应该在该函数的每次调用中重新分配。

ç参数

万博1manbetx模型范围

函数返回

输出

双u

输入,参数,常数

双U []

双u [] [2]

双U [2] [3]

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

双倍* U

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

常量双* U

const双u []

CONST双U [] [2]

CONST双U [2] [3]

输入(默认),参数

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

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

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

标签-指示Simulink块中对应参数的标签。万博1manbetx默认情况下,参数标签与参数名称相同,除非您更改了它。

万博1manbetx模型范围 万博1manbetx仿真软件端口标签

输入,输出

端口名称
输入输出 输入和输出端口中的端口名称

参数

参数名称

常数

常数值的表达式。

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

类型-演示Simulink数据类型和C函数参数数据类型之间的匹配。万博1manbetx

C参数数据类型 万博1manbetxSimulink的数据类型
符号字符 int8
无符号的字符 uint8
烧焦 int8或uint8,取决于编译器
INT* INT32
无符号整型* uint32
* INT16
* int32或fixdt(1,64,0),取决于操作系统
浮动
int8_t* int8
uint8_t* int8
int16_t* INT16
uint16_t* UINT16
int32_t* INT32
uint32_t* uint32
类型定义struct{…}AStruct* * 总线:AStruct
的typedef枚举{..} AnEnum* * 枚举:AnEnum

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

**本C调用者同步按钮提示你被C功能的Simulink总线和枚举类型使用进口结构或枚举类型。万博1manbetx

大小- 指定参数中的数据维度。

C参数维度 万博1manbetx仿真软件端口尺寸

双u

标量(1)

双U []

双u [] [2]

继承(-1)(默认)

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

双倍* U

继承(-1)(默认)

如果参数是输入输出,则不能继承大小,即使中的大小输出端口可以被继承。

双U [2] [3]

Size为[2,3]。

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

改变端口规范表属性,您可以通过编程创建FunctionPortSpecification对象并修改其属性。创建一个FunctionPortSpecification对象为选定C调用者块在一个模型中,键入命令行:

myCCallerConfigObj = get_param (gcb),“FunctionPortSpecification”)
myCCallerConfigObj = FunctionPortSpecification with properties: CPrototype: 'real_T add(real_T u1, real_T u2);'万博1manbetx返回参数:[1×1 Simulink.CustomCode.FunctionA万博1manbetxrgument]
CPrototype属性是只读的,并显示C函数的输入变量的声明。的InputArgumentReturnArgument创建一个属性FunctionArgument对象,您可以根据为其定义的规则进一步编辑其属性端口规范表上面。看到FunctionPortSpecification要学习更多的知识。

创建自定义的C调用程序库

您可以创建一个库模型来对您的C调用者块和保持您的模型组织。

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

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

  3. 选择Cc++在里面语言选项,取决于您的代码,并确保导入自定义代码框被选中。

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

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

  6. 要将一个块从库模型插入到Simulink模型中,只需将该块拖放到模型中。万博1manbetx

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

将外部调试器附加到MATLAB®过程,并调试外部C代码,生成调试符号使用:

万博1manbetxSimulink.CustomCode.debugSymbols (“上”)
你以后打开此设置和更新模型,生成的调试符号,你可以将一个外部调试器到你的MATLAB程序。

使用以下方法关闭此设置:

万博1manbetxSimulink.CustomCode.debugSymbols (“关”)

限制

  • C状态的全局初始化如果你的C函数读或写全局或静态变量,观察顺序。例如,如果多个C函数访问同一组全局变量,那么块的执行顺序可能会导致意外的结果。

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

  • 复杂的数据支持万博1manbetx- - -C调用者块在Simulink中不支持复万博1manbetx杂数据类型。万博1manbetx

  • 连续样品时间- - -C调用者块不支持连续采样时间。万博1manbetx

  • 变量参数- C语言不支持变量参数,例如,万博1manbetxsprintf(char *str, const char *format,…)

  • C ++语法- - -C调用者块不直接支持本地C ++语法。万博1manbetx你需要写一个C函数包装用C ++代码的接口。

为了测试您的模型,其中包括C调用者块,见测试集成C代码(万博1manbetx仿真软件测试)。

另请参阅

||||||

相关的话题