Main Content

从模型和生成的代码调用外部 C 代码

通过使用代码继承工具从仿真或生成的代码调用现有外部函数。

了解如何:

  • 将 C 函数作为 Simulink® 模型仿真的一部分进行计算。

  • 从您从模型生成的代码中调用 C 函数。

有关示例模型的信息,请参阅为 C 代码生成准备控制算法模型

替换过程

打开示例模型 rtwdemo_PCG_Eval_P4

对于许多基于模型的设计应用,除了 Simulink® 模型之外,设计还包括一组经过测试和验证的现有 C 函数。您可以将这些函数集成到一个 Simulink® 模型中,并生成使用这些函数的代码。

在本示例中,您将创建一个调用现有 C 函数的自定义 Simulink® 模块。然后,将该模块包含在一个模型中,并通过在 Simulink® 中进行模型仿真来测试整个系统。

在示例模型中,您可以将 PI 控制器中的 Lookup 模块(查找表)替换为对一个现有 C 函数的调用。该函数在文件 SimpleTable.cSimpleTable.h 中定义。

查看 SimpleTable.c

查看 SimpleTable.h

创建调用 C 函数的模块

要指定对现有 C 函数的调用,请使用 S-Function 模块。您可以使用代码继承工具自动创建 S-Function 模块。在该工具中,您将首先为现有 C 函数指定接口。然后,工具使用该接口创建一个 S-Function 模块。

使用代码继承工具为 SimpleTable.c 中的现有 C 函数创建一个 S-Function 模块。

1.创建一个结构体以包含函数接口的定义。

def = legacy_code('initialize')

您可以使用结构体 def 定义现有 C 代码的函数接口。

2.填充该结构体的字段。

3.创建 S-Function。

legacy_code('sfcn_cmex_generate',def)

4.编译 S-Function。

legacy_code('compile',def)

5.创建 S-Function 模块。

legacy_code('slblock_generate',def)

生成的 S-Function 模块调用 SimpleTable.c 中的 C 函数。您现在可以在模型中使用此 S-Function 模块。

6.创建 TLC 文件。

legacy_code('sfcn_tlc_generate',def)

此命令创建一个 TLC 文件,该文件是 S-Function 的一个组件,指定如何为模块生成代码。

通过仿真验证外部代码

在 Simulink® 模型中集成现有 C 代码时,将验证生成的 S-Function 模块。

要验证 Lookup 模块的替换,请将 Lookup 模块产生的仿真结果与新 S-Function 模块产生的结果进行比较。

1.打开验证模型。

  • Sine Wave 模块从 [-2 :2] 产生输出值。

  • 查找表的输入范围来自 [-1 :1]。

  • 查找表输出输入的绝对值。

  • 查找表根据输入范围对输出进行裁剪。

2.运行验证模型。

下图显示验证结果。现有 C 代码和 Simulink® 表模块产生相同的输出值。

将 C 代码作为 Simulink® 模型的一部分进行验证

将现有 C 函数代码作为独立组件进行验证后,在模型中验证 S-Function。要完成验证,请使用测试框架模型。

1.打开测试框架。

2.运行测试框架。

仿真结果与黄金值匹配。

从生成的代码调用 C 函数

代码生成器使用 TLC 文件处理 S-Function 模块,就像处理任何其他模块一样。代码生成器可以使用 S-Function 模块实现表达式折叠,这是一种将多个计算合并到一个输出计算中的操作。

1.编译完整模型。

2.PI_Control_Reusable.c 中检查生成的代码。

生成的代码现在调用 SimpleTable C 函数。

下面的图显示生成的代码在 C 代码集成之前和之后的情况。在集成之前,代码调用生成的查找例程。在集成之后,生成的代码调用 C 函数 SimpleTable

相关主题