主要内容

使用c代码使用C来电者

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

  • 简单C功能自动集成

  • 集成金宝appSimulink Coverage™金宝appSimulink Test™, 和金宝app仿真软件设计校验™

  • 集成金宝appSimulink Coder™

C调用者块允许您将C算法带入Simulink。金宝app要模拟动态系统,请使用S函数建设者反而。后续步骤描述了使用C代码将C代码集成到Simulink的工作流程金宝appC来电者块。

指定源代码和依赖项

指定包含C功能的外部源代码文件。

  1. 从Simu金宝applink ToolStrip,打开配置参数

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

  3. 要通过C Caller块启用代码解析,请确保导入自定义代码框被选中。

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

  4. 选择标题文件并使用中输入头文件的名称# include标签。

  5. 在下面其他构建信息, 选择包括目录,并输入存储附加构建信息(如头文件)的文件夹。

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

请注意

如果一个函数在头文件中声明,但没有在源代码中实现,则会自动生成一个空的存根函数来模拟和编译模型。

定义默认函数数组布局

您可以指定矩阵数据在Simulink中存储的顺序。金宝app传递给C函数的矩阵数据被转换为您指定的默认函数数组布局。如果未指定函数数组布局,则矩阵数据通过C来电者与您的Simulink数据的顺序相同,并且由于行-列金宝app的主要混乱可能会发生计算错误。确保所有Simulink数据都遵循相同的默认函数数组布局。金宝app

  • 专栏专业- 这C来电者块以列主顺序处理Simuli金宝appnk数据。假设你有一个3 × 3矩阵。在里面C来电者块,此矩阵存储在此序列中:第一列,第二列和第三列。

  • 划艇- 这C来电者阻止以行主要顺序处理Simu金宝applink数据。假设你有一个3 × 3矩阵。在里面C来电者块,此矩阵存储在此序列中:第一行,第二行和第三行。

  • 任何- 阵列数据可以存储在列 - 主要和行主要订单中C来电者块。因此,您可以在列专业和行主要设置中生成代码。

  • 未指定—Array数据可以按column-major和row-major的顺序存储。相比任何设置,您只能在列主要设置中生成代码。

要了解关于Simulink中的行主数组和列主数组布局的更多信息,请参见金宝app默认函数数组布局

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

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

  3. 点击应用接受你的改变。

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

称呼C来电者块并指定端口

您可以通过在Simulink画布中键入c调用程序来启动自定义C代码集成到Simulink。金宝app或者,拖动一个C来电者块的库浏览器>用户定义函数.双击块以打开块参数对话框查看功能和端口规范的名称。

  1. 点击一下刷新自定义代码导入源代码及其依赖项。

  2. 您的C功能显示在下面函数名称.如果您无法看到完整的功能列表,请单击重新影响您的源代码。

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

  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您的参数有默认范围,具体取决于函数定义,您可以根据源代码中的函数定义更改范围。

金宝app模型范围 块映射的作用域
输入 块输入端口
输出 块输出端口
输入输出 块输入和输出端口
全球 块使用的全局变量
参数 块可调参数
持续的 恒定价值

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

C参数

金宝app模型范围

函数返回

输出

双你

输入参数持续的

双你[]

双u [] [2]

双你[2] [3]

输出(默认),输入参数

双人* U.

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

const double * u

const double u []

const double u [] [2]

Const Double U [2] [3]

输入(默认),参数

使用输入输出映射C函数中指针传递的输入的端口。使用的端口创建输入输出端口对输入和输出端口具有相同的名称。输入输出端口可以重用输入和输出端口的缓冲区。这可能会优化内存使用取决于信号大小和块布局。

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

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

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

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

一个全球范围使您能够在自定义代码和数据之间传输数据C来电者块并允许您在块的计算过程中使用全局变量。使用的值使用全球块接口上不可见范围。此表显示了示例代码片段及其默认和可用端口。

示例代码 金宝app模型范围

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

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

输入(默认)

全球

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

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

输出(默认)

全球

输入输出

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

数据读取并写在全局变量上。可用范围是:

全球(默认)

输入输出

输出

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

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

输入输出

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

范围

参数名称

持续的

表达恒定值。

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

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

C参数数据类型 金宝appsimulink数据类型
签名字符 INT8.
无符号的字符 uint8.
char INT8或UINT8,取决于编译器
int INT32.
unsigned int. 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
typedef struct{…Arunachal Pradesh, 总线:AStruct
typedef enum {. .} AnEnumArunachal Pradesh, 枚举:Anenum.

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

** 这C来电者同步按钮会提示您将C函数使用的结构或枚举类型导入Simulink总线和枚举类型。金宝app

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

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

双你

标量(1)

双你[]

双u [] [2]

继承(-1)(默认)

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

双人* U.

继承(-1)(默认)

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

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

双你[2] [3]

大小为[2,3]。

创建一个FunctionPortSpecification对象和编辑C来电者块属性

改变端口规范表格属性以编程方式,您可以创建一个FunctionPortSpecification对象并修改其属性。创建一个FunctionPortSpecification对象的C来电者块在模型中,键入命令行:

myccallerconfigobj = get_param(gcb,'functionportspecification'
myccallerconfigobj = fulityPortspecification具有属性:cprototype:'real_t添加(real_t u1,real_t u2);'InceewArguments:[1×2 金宝appsimulink.customcode.functionalgument] returnargument:[1×1 simulink.customcode.functionalguments] globalarguments:[1×0 simulink.customcode.cunctionalgument]
cprototype.属性是只读的,并显示C函数输入变量的声明。的InputArgument返回aragument.属性创建A.functionargument.您可以根据为的规则进一步编辑其属性端口规范表上面。你可以看到FunctionPortSpecification了解更多。

修改A中的全局参数C来电者块,创建一个句柄GlobalArguments对象使用GetGlobalarg.并修改它的属性。

创建一个自定义C调用程序库

您可以创建一个库模型以对您进行分组C来电者块并保持您的型号组织。

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

  2. 在这一点造型选项卡,在设计, 点击模拟自定义代码

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

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

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

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

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

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

金宝appsimulink.customcode.debugsymbols(“上”
打开此设置并更新模型后,生成调试符号,您可以将外部调试器附加到MATLAB进程。

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

金宝appsimulink.customcode.debugsymbols('离开'

限制

  • 全局变量- 全局变量作为功能输入输出不支持多维数组。金宝app

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

  • 复杂的数据支持金宝app- 这C来电者块不支持Simulink中的复金宝app杂数据类型。金宝app

  • 连续样品时间- 这C来电者块不支持连续采样时间。金宝app

  • 变量参数- 例如,不支持C中的变量参数,金宝appINT Sprintf(Char * str,const char *格式,......)

  • C ++语法- 这C来电者块不直接支持本机C ++语法。金宝app您需要将C函数包装器写入与C ++代码接口。

来测试您的模型,其中包括C来电者块,看测试集成C代码(金宝app仿真软件测试)

另请参阅

|||||||

相关话题