文档

调用可重用的外部算法代码进行模拟和代码生成

代码重用提供了业务和技术优势。从业务的角度来看,代码重用节省了时间和资源。从技术的角度来看,代码重用提高了一致性并减少了内存需求。其他考虑因素包括:

  • 模块化应用程序

  • 重用优化的算法

  • 与预定义数据集进行接口

  • 开发应用程序变体

可重用的独立于硬件的算法代码示例,考虑导入到Simulink中金宝app®用于模拟和代码生成的环境包括:

  • 效用函数

  • 查找表

  • 数字滤波器

  • 专业集成商

  • 比例积分导数(PID)控制模块

工作流

要调用可重用的外部算法代码进行模拟和代码生成,请遍历该表中列出的任务。

任务 行动 更多的信息
1 检查您对外部代码特征和集成需求的评估。 选择外部代码集成工作流(嵌入式编码)
2 根据外部代码的编程语言,选择一种集成方法将外部代码添加到Simulink模型中。金宝app 选择集成方法(嵌入式编码)
3. 通过仿真模型验证算法行为和性能。 模拟(金宝app模型)
4 为代码生成定义模型数据的表示。 外部C/ c++代码与Simulink模型或生成代码之间的数据交换金宝app(嵌入式编码)
5 为代码生成配置模型。 生成与外部代码外观相匹配的代码(嵌入式编码器)和模型配置(嵌入式编码)
6 生成代码和代码生成报告。 代码生成(嵌入式编码)
7 检查生成的代码接口和静态代码度量。 分析生成的代码接口(嵌入式编码器)和静态代码度量(嵌入式编码)
8 从模型构建一个可执行程序。 在Simulink环境中构建集成代码金宝app(嵌入式编码)
9 验证可执行程序的行为是否符合预期。 数值等效性检验(嵌入式编码)
10 验证可执行程序按预期执行。 代码执行分析(嵌入式编码)

选择集成方法

有几种方法可用于将可重用算法代码集成到Simulink环境中进行代码生成。金宝app有些方法直接集成外部代码。其他方法将外部代码转换为Simulink或Stateflow金宝app®为模拟建模元素,然后从建模的设计生成代码。您选择的集成方法取决于:

  • 外部代码的编程语言——MATLAB®、C、c++或Fortran

  • 您的编程语言经验和偏好

  • 性能需求

  • 无论算法必须对连续时间动态建模,还是将算法集成到使用离散时间和连续时间的应用程序中

  • 您是否希望利用基于模型的设计

  • 对代码生成器生成的代码所需的控制级别

要为可重用算法选择一种方法,请参阅与外部算法代码的编程语言相匹配的小节。

外部MATLAB代码的集成方法

有多种方法可以将外部MATLAB代码集成到Simulink环境中。金宝app下面的关系图和表格帮助您根据集成需求为应用程序选择最佳的集成方法。

条件或要求 行动 更多的信息
1 算法必须建立连续状态动力学模型。 编写MATLAB s函数,并为算法编写相应的TLC文件以生成代码。将s函数添加到模型中。
2 外部代码遵循代码生成子集的MATLAB代码,您希望从Simulink模型调用MATLAB代码。金宝app 向模型中添加一个MATLAB函数块。将MATLAB代码嵌入到该块中。
3. 外部代码遵循代码生成子集的MATLAB代码,您希望从Simulink模型调用MATLAB代码,并且您的算法包括处理大量数据流的迭代计算。金宝app 向模型中添加一个MATLAB系统块。将MATLAB代码作为系统对象™嵌入到该块中。
4 外部代码遵循用于代码生成子集的MATLAB代码,您希望从Simulink模型调用MATLAB代码,并且您的算法包括基于状态机和流程图的设计逻辑。金宝app 向模型添加一个状态流图。使用MATLAB作为动作语言,从图表中调用外部代码。
5 你想要用parfor函数,用于并行计算或可用于的接口数据类型MATLAB编码器™金宝app仿真软件编码器、嵌入式编码器®.使用parfor,必须安装并行计算工具箱™。 使用软件生成C代码。然后,将生成的代码作为外部C代码调用。
6 您有C或c++编程经验,外部MATLAB代码很紧凑,主要使用C或c++结构。 手动将MATLAB代码转换为C或c++代码。为C或c++代码选择集成方法。

外部C或c++代码的集成方法(嵌入式编码)

7 外部MATLAB代码的部分映射到内置块。 在模型的上下文中,使用适用的内置块开发算法。

将外部MATLAB代码嵌入到MATLAB函数模块从MATLAB代码中阻塞或生成C或c++代码MATLAB编码器软件,MATLAB代码必须使用函数和类支持的C/ c++代码生成。金宝app

外部C或c++代码的集成方法

在大多数情况下,您可以通过使用遗留代码工具生成s函数和TLC文件,将用C或c++编写的外部代码集成到Simulink环境中。金宝app该工具使用您作为MATLAB代码提供的规范来将现有的MATLAB函数转换为C MEX s函数,您可以在Simulink模型中包括这些函数并从生成的代码中调用它们。金宝app详情请参见使用遗留代码工具实现算法(金宝app模型)和使用遗留代码工具将外部代码调用导入到生成的代码中(嵌入式编码)。

与其他方法相比,遗留代码工具是生成足够适合嵌入式系统的代码的最优选择。如果存在以下一个或多个条件,请考虑其他方法:

  • 外部代码使用全局变量来交换数据。

  • 编程经验有限。

  • 该算法必须建立离散和连续状态动力学模型。

  • 您希望将集成的外部代码包含在状态流图中。

  • 外部代码需要一个定点接口。

  • 您希望最大限度地灵活控制代码生成器生成的代码。

  • 的调用中嵌入对外部代码的调用coder.ceval嵌入在MATLAB函数块中的函数,性能不是问题。

此图和表帮助您根据集成需求选择最佳的集成方法。

条件或要求 行动 更多的信息
1 您希望将外部C代码与生成的c++代码集成,或者相反 通过修改外部代码的语言来匹配生成代码的语言选择。 修改外部代码的编程语言以匹配生成的代码(嵌入式编码)
2 您的算法包括基于状态机和流程图的设计逻辑。或者,您想要集成的函数必须通过使用全局变量与模型交换数据。函数定义全局变量并使用它们写入输出,而不是返回值(return)或将输出写入参数。 向模型添加一个状态流图。从图表中调用外部代码,使用C作为操作语言。在图表中,编写调用外部函数并对全局变量进行读写的代码。要使用外部代码的输出执行计算,模型必须在执行期间从全局变量中读取。 将外部代码插入状态流图(嵌入式编码)
3. 您希望在状态流图中包含外部C或c++代码,以进行模拟和代码生成。 配置包含图表的模型,以应用外部C或c++代码。
4 您很快就想在模型中嵌入对外部C或c++代码的调用。性能不是问题。 方法调用C或c++代码coder.ceval函数从MATLAB函数块中。
5 应用程序需要比代码生成器通常产生的更多的入口点函数—例如,超过模型_step模型_initialize,模型_terminate.您希望最大限度地灵活控制代码生成器生成的代码。 手动编写S-function和TLC文件。
6 您希望为离散时间应用程序模拟和生成外部代码。优化生成的代码是必不可少的。您希望易于使用,并具有适度的灵活性来控制代码生成器生成的代码。您有C或c++编程经验,但您更喜欢生成将代码添加到模型中的文件。

使用遗留代码工具生成s函数和TLC文件。如果有必要,手动细化生成的代码以满足应用程序需求。(如果您更改了生成的代码,那么如果您重新生成s函数和TLC文件,则会丢失所做的更改。)

对于用C编写的简单算法,可以考虑使用Simulink金宝appC调用者块。

7 该算法必须建立离散和连续状态动力学模型,以便进行仿真和快速成型。外部代码需要一个定点接口。编程经验有限。您需要易于使用和基本的灵活性,以控制代码生成器为快速原型生成的代码。 使用S-function Builder生成S-function和TLC文件。如果有必要,手动细化生成的代码以满足应用程序需求。(如果您更改了生成的代码,那么如果您重新生成s函数和TLC文件,则会丢失所做的更改。)

修改外部代码的编程语言以匹配生成的代码

要将外部C代码与生成的c++代码集成,或者相反,修改外部代码的语言以匹配生成代码的编程语言选择。使编程语言匹配的选项包括:

  • 用生成代码的语言选择编写或重写外部代码。

  • 如果生成的是c++代码,而外部代码是C代码,那么对于每个C函数,创建一个头文件来创建函数的原型。使用以下格式:

    #ifdef __cplusplus extern "C" {#endif int my_c_function_wrapper();#ifdef __cplusplus} #endif

    原型用作函数包装器。如果编译器支持c++代码,则值金宝app__cplusplus定义。联动规范外来的“C”指定C链接,没有名称篡改。

  • 如果您生成的是C代码,而外部代码是c++代码,请包含外来的“C”每个的链接规范. cpp文件。例如,下面的示例显示了文件中的c++代码my_func.cpp

    extern "C" {int my_cpp_function(){…}}

外部Fortran代码的集成方法

为了集成外部Fortran代码,编写一个s函数和相应的TLC文件。

看到C/ c++ s -函数基础(金宝app模型),使用Fortran代码实现算法(金宝app模型),s函数和代码生成(Embedded Coder)和Fortran s -函数示例(金宝app模型)。

插入外部代码Stateflow图表

为图书馆图表集成外部代码

要集成仅应用于Stateflow库图的外部代码以生成代码,对于每个向您的主模型贡献图表的库模型,请完成以下步骤。然后,生成代码。

  1. 在状态流编辑器中,打开模型配置对话框。选择参数使用本地自定义代码设置(不从主模型继承)

    库模型在代码生成期间保留自己的自定义代码设置。

  2. 在子窗格中指定自定义代码。

    请遵循指定自定义代码的相对路径(Stateflow)。

    如果为模拟指定了自定义代码设置,则可以将这些设置应用于代码生成。为了避免两次输入相同的信息,请选择使用与模拟目标相同的自定义代码设置

  3. 点击好吧

在为每个库模型完成这些步骤之后,生成代码。

为所有图表集成外部代码

集成适用于所有图表的外部代码以生成代码:

  1. 为主模型的代码生成指定自定义代码选项。

    1. 在“模型配置参数”对话框中,选择代码生成>自定义代码

    2. 在自定义代码文本字段中,指定自定义代码。

      请遵循指定自定义代码的相对路径(Stateflow)。

      如果为模拟指定了自定义代码设置,则可以将这些设置应用于代码生成。为了避免两次输入相同的信息,请选择使用与模拟目标相同的自定义代码设置

  2. 为每个向主模型提供图表的库模型配置代码生成。在状态流编辑器中,打开模型配置对话框。明确的参数使用本地自定义代码设置(不从主模型继承).库图继承主模型的自定义代码设置。点击好吧

  3. 生成的代码。

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

通过使用遗留代码工具从模拟或生成的代码中调用现有的外部函数。

学习如何:

  • 评估一个C函数作为Simulink®模型仿真的一部分。金宝app

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

有关示例模型的信息,请参见从嵌入式系统的控制算法生成C代码(嵌入式编码)。

更换过程

打开示例模型,rtwdemo_PCG_Eval_P4

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

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

在示例模型中,可以用对现有C函数的调用替换PI控制器中的Lookup块(查找表)。函数在文件中定义SimpleTable.c而且SimpleTable.h

视图SimpleTable.c

视图SimpleTable.h

创建调用C函数的块

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

使用遗留代码工具为现有的C函数创建一个S-Function块SimpleTable.c

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

Def = legacy_code(“初始化”

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

2.填充结构的字段。

3.创建s函数。

legacy_code (“sfcn_cmex_generate”def)

4.编译s函数。

legacy_code (“编译”def)

5.创建S-Function块。

legacy_code (“slblock_generate”def)

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

6.创建TLC文件。

legacy_code (“sfcn_tlc_generate”def)

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

通过模拟验证外部代码

当您在Simulink®模型中集成现有的C代码时,请验证生成的S-Functio金宝appn块。

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

1.打开验证模型。

  • 正弦波块从[-2:2]产生输出值。

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

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

  • 查找表在输入限制处截取输出。

2.运行验证模型。

图中显示了验证结果。现有的C代码和Simulink®表块产生相同的输出值。金宝app

验证C代码作为Simulink®模型的一部分金宝app

在将现有的C函数代码作为独立的组件进行验证之后,在模型中验证s函数。要完成验证,请使用测试工具模型。

1.打开测试带。

2.运行测试线束。

仿真结果符合黄金值。

从生成的代码中调用C函数

代码生成器使用TLC文件像处理其他块一样处理S-Function块。代码生成器可以实现表达折叠S-Function块是将多个计算合并为一个输出计算的操作。

1.构建完整的模型。

2.中生成的代码PI_Control_Reusable.c

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

图中显示了C代码集成前后生成的代码。在集成之前,代码调用生成的查找例程。在集成之后,生成的代码调用C函数SimpleTable

相关的话题