调用可重用外部模拟算法代码和代码生成
代码重用提供业务和技术优势。从业务的角度来看,代码重用可以节省时间和资源。从技术的角度来看,代码重用促进一致性和减少内存需求。其他因素包括:
模块化应用程序
重用一个优化算法
与一个预定义的数据集
开发应用程序变量
可重用的代码独立于硬件的算法考虑的例子导入到模型金宝app®环境模拟和生成代码包括:
效用函数
查找表
数字滤波器
专业集成商
Proportional-integral-derivative (PID)控制模块
工作流
调用可重用外部算法仿真和代码生成代码,遍历表中列出的任务。
任务 | 行动 | 更多的信息 |
---|---|---|
1 | 回顾你的评估外部代码特点和集成需求。 | 选择一个外部代码集成工作流 |
2 | 基于外部代码的编程语言,选择一个集成方法将外部代码添加到仿真软件模型。金宝app | 选择一个集成方法 |
3 | 通过仿真模型验证算法的行为和性能。 | 模拟 |
4 | 定义代码生成的模型数据的表示。 | 外部C / c++代码之间交换数据和仿真软件模型生成的代码金宝app |
5 | 为代码生成配置模型。 | 生成代码相匹配的外部代码和模型配置 |
6 | 生成代码和代码生成报告。 | 代码生成 |
7 | 检查生成的代码接口和静态代码度量。 | 分析生成的代码接口和静态代码度量 |
8 | 从模型中构建一个可执行程序。 | 在仿真软件环境中构建集成的代码金宝app |
9 | 确认可执行程序的行为。 | 数值等价测试 |
10 | 确认可执行程序执行。 | 代码执行分析 |
选择一个集成方法
有几种方法可用于将可重用算法代码集成到模型的代码生成环境。金宝app一些方法直接集成外部代码。其他方法将外部代码转换为仿真软件或Stateflow金宝app®仿真建模元素,后来代码生成的建模设计。集成方法的选择取决于:
——MATLAB编程语言的外部代码®,C, c++,或者Fortran
你的编程语言的经验和偏好
性能需求
算法必须连续时间动态模型或是否你将该算法集成到一个应用程序,该应用程序使用离散和连续时间
你是否想利用基于模型的设计
级别的控制需要在代码生成器生成的代码
为一个可重用的算法选择一个方法,看到分段匹配您的外部算法的编程语言的代码。
外部MATLAB代码的集成方法
多种方法可用于将外部MATLAB代码集成到仿真软件环境。金宝app下面的图和表帮助你选择最好的为您的应用程序集成方法基于集成需求。
条件或要求 | 行动 | 更多的信息 | |
---|---|---|---|
1 | 该算法必须动态模型连续状态。 | 写一个MATLAB函数,生成代码,对应的TLC文件的算法。将功能添加到模型中。 | |
2 | 外部代码符合代码生成的MATLAB代码子集,您想调用MATLAB代码从一个仿真软件模型。金宝app | 对模型添加一个MATLAB功能块。嵌入的MATLAB代码块。 | |
3 | 外部代码符合的MATLAB代码代码生成子集,你想从一个仿真软件模型,调用MATLAB代码和你的算法包括迭代计算过程大量的数据流。金宝app | MATLAB系统块添加到模型中。嵌入的MATLAB代码块作为一个系统对象™。 | |
4 | 外部代码符合的MATLAB代码代码生成子集,你想从一个仿真软件模型,调用MATLAB代码和你的算法包括基于状态机的设计逻辑流程图。金宝app | Stateflow图添加到模型中。从图表调用外部代码,使用MATLAB作为行动的语言。 |
|
5 | 你想使用parfor 函数并行计算或接口数据类型可用MATLAB编码器™,金宝app仿真软件编码器,嵌入式编码器®。使用parfor 并行计算工具箱™必须安装。 |
使用软件生成C代码。然后,调用外部C代码,生成的代码。 | |
6 | 你有C或c++编程经验和外部MATLAB代码紧凑,主要使用C或c++构造。 | 手动将MATLAB代码转换为C或c++代码。选择一个C或c++代码的集成方法。 | |
7 | 部分外部MATLAB代码映射到内置的街区。 | 开发模型的上下文中算法,使用适用的内置块。 |
嵌入外部MATLAB代码MATLAB函数阻止或生成C或c++代码与MATLAB代码MATLAB编码器软件,MATLAB代码必须使用函数和类支持C / c++代码生成。金宝app
集成外部C或c++代码的方法
在大多数情况下,您可以集成外部C或c++编写的代码到仿真软件环境中通过生成S-functions和TLC文件遗留代码的工具。金宝app这个工具使用规范,你供应MATLAB代码将现有的MATLAB函数转换成C墨西哥人S-functions打来,可以包括在仿真软件模型和生成的代码。金宝app有关详细信息,请参见使用遗留代码实现的算法工具和调用外部代码导入生成的代码与遗留代码的工具。
替代方法相比,遗留代码生成代码的工具是最优的选择对嵌入式系统进行了优化。考虑的替代方法,如果存在一个或多个下列条件:
外部代码使用全局变量来交换数据。
编程经验是有限的。
该算法必须动态模型离散和连续状态。
你想要包括Stateflow图集成外部代码。
外部代码需要一个定点接口。
你要控制什么代码代码生成器产生的最大的灵活性。
你很快要嵌入一个调用外部代码调用
coder.ceval
MATLAB功能块中嵌入函数,和性能不是问题。
这张图和表帮助你选择最好的集成方法基于集成需求。
条件或要求 | 行动 | 更多的信息 | |
---|---|---|---|
1 | 你想要集成外部C代码生成c++代码或相反 | 匹配的语言选择生成的代码通过修改外部的语言代码。 | 修改外部代码的编程语言来匹配生成的代码 |
2 | 你的算法包括基于状态机的设计逻辑流程图。或者,一个函数,你想整合必须使用全局变量与模型交换数据。函数定义了全局变量,并使用它们编写输出而不是返回一个值(返回)或输出写入一个论点。 | Stateflow图添加到模型中。从图表调用外部代码,使用C作为行动的语言。图,编写代码来调用外部函数和全局变量的读取和写入。与外部代码的输出执行计算,模型必须从全局变量在执行期间读取。 | 外部代码插入Stateflow图表 |
3 | 你想要包括外部C或c++代码Stateflow图仿真和代码生成。 | 配置模型,该模型包含了图表应用外部C或c++代码。 |
|
4 | 你很快要嵌入调用外部C或c++代码模型。性能不是问题。 | 调用的C或c++代码coder.ceval 函数在一个MATLAB函数块。 |
|
5 | 应用程序需要更多的入口点函数通常比代码生成器产生的例子,多 , , 。你要控制什么代码代码生成器产生的最大的灵活性。 |
手动编写一个函数和TLC文件。 | |
6 | 你想模拟和生成一个离散时间的外部代码的应用程序。优化生成的代码是至关重要的。你想要的易用性和适度的灵活性来控制代码生成器生成的代码。你有C或c++编程经验,但是你喜欢生成文件添加到模型的代码。 | 遗留代码生成功能和TLC文件通过使用工具。如果有必要,提炼手动生成的代码来满足应用需求。(如果你改变生成的代码,你将失去如果再生功能的变化和TLC文件。) 对于简单的算法用C编写的,可以考虑使用仿真软件金宝appC调用者块。 |
|
7 | 算法必须模型离散和连续状态动力学仿真和快速原型。外部代码需要一个定点接口。编程经验是有限的。你想要的易用性与基本控制灵活性快速原型的代码生成器生成的代码。 | 生成函数和TLC文件利用s函数生成器。如果有必要,提炼手动生成的代码来满足应用需求。(如果你改变生成的代码,你将失去如果再生功能的变化和TLC文件。) |
修改外部代码的编程语言来匹配生成的代码
集成外部C代码生成c++代码或相反,修改的语言外部代码匹配生成的代码编程语言选择。对使编程语言匹配选项包括:
写或改写外部代码生成的代码的语言选择。
如果你是生成c++代码和外部代码是C代码,对于每一个C函数,创建一个原型函数的头文件。使用这种格式:
# ifdef __cplusplus外来的“C”{# endif int my_c_function_wrapper ();# ifdef __cplusplus} # endif
原型作为一个包装器函数。如果你的编译器支持c++代码,值金宝app
__cplusplus
定义。规范的联系外来的“C”
指定C链接没有名字碾压。如果你是生成C代码和外部代码是c++代码,包括一个
外来的“C”
链接规范在每个. cpp
文件。例如,下面的例子显示了c++代码的文件my_func.cpp
:外来的“C”{int my_cpp_function () {…}}
外部Fortran代码的集成方法
集成外部Fortran代码,编写一个函数和相应的TLC文件。
看到C / c++函数基础知识,使用Fortran语言实现算法的代码,S-Functions和代码生成,Fortran s函数的例子。
外部代码插入Stateflow图表
集成外部代码库图表
集成外部代码只适用于Stateflow图书馆为代码生成图表,为每个库模型,图表有助于你的主要模型,完成这些步骤。然后,生成代码。
在Stateflow编辑器,打开模型配置参数对话框。选择参数使用本地自定义代码设置(不继承主要模型),
库模型保留自己的自定义代码设置在代码生成。
subpanes指定您的自定义代码。
遵循指导方针指定自定义代码相对路径(Stateflow)。
如果你指定自定义代码设置模拟,可以将这些设置应用到代码生成。为了避免两次输入相同的信息,选择使用相同的自定义代码设置为模拟目标。
点击好吧。
在完成这些步骤对于每个库模型,生成的代码。
所有图表整合外部代码
集成外部代码适用于所有代码生成的图表:
指定自定义代码的选择你的主要模型的代码生成。
在模型中配置参数对话框中,选择代码生成>自定义代码。
在自定义代码文本字段中,指定您的自定义代码。
遵循指导方针指定自定义代码相对路径(Stateflow)。
如果你指定自定义代码设置模拟,可以将这些设置应用到代码生成。为了避免两次输入相同的信息,选择使用相同的自定义代码设置为模拟目标。
为每个库配置代码生成模型,图表有助于你的主要模型。在Stateflow编辑器,打开模型配置参数对话框。明确的参数使用本地自定义代码设置(不继承主要模型)。图书馆图表继承你的主要模型的自定义代码设置。点击好吧。
生成的代码。
从模型和生成的代码调用外部C代码
调用现有的外部函数从一个模拟或通过使用遗留代码工具生成的代码。
学习如何:
评估一个C函数作为模型的一部分®模型模拟。金宝app
调用一个C函数生成的代码从一个模型。
信息模型的例子,请参阅准备一个控制算法模型C代码生成。
更换过程
打开示例模型,rtwdemo_PCG_Eval_P4
。
对于许多基于模型设计应用程序,除了模型®模型,设计包括一组现有的C函数已经被测试和验证。金宝app你可以将这些功能集成到一个模型®模型和生成代码使用功能。金宝app
在本例中,您创建一个自定义模型®块调用现有的C函数。金宝app然后包括块模型和测试整个系统通过模型模拟仿真软件®。金宝app
在模型的例子中,你可以替换查找块(查找表)在PI控制器调用现有的C函数。在文件中定义的函数SimpleTable.c
和SimpleTable.h
。
创建调用C函数的块
指定一个现有的C函数的调用,使用一个功能块。可以自动的创建功能块使用遗留代码的工具。在该工具中,首先为您现有的C函数指定一个接口。然后工具使用该接口来创建一个功能块。
使用遗留代码工具为现有的C函数创建一个功能块SimpleTable.c
。
def = legacy_code (“初始化”)
您可以使用结构def
定义的函数接口现有的C代码。
2。填充的字段结构。
3所示。创建功能。
legacy_code (“sfcn_cmex_generate”def)
4所示。编译功能。
legacy_code (“编译”def)
5。创建一个功能块。
legacy_code (“slblock_generate”def)
生成的功能块中调用C函数SimpleTable.c
。现在,您可以使用此功能块模型。
6。创建TLC文件。
legacy_code (“sfcn_tlc_generate”def)
这个命令创建了一个薄层色谱文件,它是一个功能的组件,用于指定如何生成的代码块。
通过仿真验证外部代码
当你在一个仿真软件集成现有的C代码®模型,验证生成的功能块。金宝app
验证更换查找模块,比较仿真结果查询块产生的结果产生的新功能块。
1。打开验证模型。
正弦波阻止产生输出值[2:2]。
查找表的输入范围(1):1)。
查找表输出输入的绝对值。
查找表剪辑输出在输入限制。
2。运行验证模型。
图中显示验证结果。现有的C代码和仿真软件®表块产生相同的输出值。金宝app
验证C代码的仿真软件®模型金宝app
后验证现有的C函数代码作为一个独立的组件,验证模型中的功能。完成验证,使用测试工具模型。
1。打开测试工具。
2。运行测试工具。
仿真结果与黄金价值。
从生成的代码调用C函数
代码生成器使用薄层色谱文件处理功能块像其他块。代码生成器可以实现表达折叠功能块,手术结合多个计算成一个单一的输出计算。
1。构建完整的模型。
2。检查生成的代码PI_Control_Reusable.c
。
现在生成的代码调用SimpleTable
C函数。
数据显示生成的代码前后C代码集成。在集成之前,代码调用生成的查找程序。集成后,生成的代码调用C函数SimpleTable
。