主要内容

S函数和代码生成

你使用s函数来扩展Simulink金宝app®金宝app支持模拟和代码生成。例如,您可以使用它们:

  • 代表自定义算法

  • 将现有的外部代码与Simulink模型和生成的代码进行接口金宝app

  • 表示与硬件接口的设备驱动程序

  • 为嵌入式系统生成高度优化的代码

  • 验证作为Simulink仿真的一部分为子系统生成的代码金宝app

用于编写S函数的应用程序界面(API)允许您以大量的灵活性在Simulink环境中实现泛型算法。金宝app如果打算在代码生成模型中使用S-函数,则灵活性级别可能会有所不同。例如,无法访问MATLAB®来自与代码生成器一起使用的S函数的工作区。本主题说明要注意使用S函数的条件。但是,使用本主题中提出的技术,您可以为与生成的代码一起使用的大多数应用程序创建S函数。

尽管S-functions为在模型中实现复杂算法提供了通用和灵活的解决方案,但底层API在内存和计算资源方面会产生开销。大多数情况下,额外的资源对于实时快速原型系统是可以接受的。但是,通常在实时嵌入式应用程序中无法获得额外的资源。通过使用代码生成器提供的Target Language Compiler技术来内联s -函数,您可以最小化内存和计算需求。如果您正在为现有的外部代码生成s函数,请考虑使用遗留代码工具来生成s函数和相关的TLC文件。

前提条件您了解以下概念:

  • 等级-2 S函数

  • 目标语言编译器(TLC)脚本

  • 代码生成器如何生成和构建C / C ++代码

笔记

此信息是供代码生成器用户使用的。即使您目前不使用代码生成器,在编写s -函数时也要遵循这些实践,特别是在您正在创建通用s -函数时。

S函数的类型

您可以选择实现s函数来进行模拟和代码生成的示例包括:

  1. “我并不担心效率。我想写我的算法的一个版本,并自动在Simulink和Code Generator产品中工作。“下载188bet金宝搏金宝app

  2. “我想在类似于内置块的Simulink和Code Generator产品中实现高度优化的算法,并生成有效的代码。”金宝app下载188bet金宝搏

  3. “我有很多手写代码,我需要接口。我想有效地调用Simulink和Code Generator产品的功能。金宝app“下载188bet金宝搏

分别是前面的情况地图到以下MathWorks®术语:

  1. Noninlined s函数

  2. 内联函数

  3. 为外部代码自动生成s函数

Noninlined S-Functions

一个非线性s函数是一个C或c++的MEX s函数,它被Simulink引擎和生成的代码相同地处理。金宝app通常,根据s函数API实现一次算法。Simu金宝applink引擎和生成的代码调用s函数例程(例如,mdlOutputs)。

非inlined S函数块的每个实例需要额外的存储器和计算资源。然而,将算法结合到模型和代码生成应用程序中的这种例程在项目的原型阶段期间典型,其中效率并不重要。通过效率获得的优势是能够快速地改变模型参数和结构的能力。

编写非线性s函数不涉及TLC编码。非线性s -函数是构建过程的默认情况,因为一旦在模型中构建了MEX s -函数,在按下之前就不需要额外的准备了Ctrl + B.来建立你的模型。

在生成makefile时,存在一些关于非内联S-function文件的名称和位置的限制。看编写非束缚的S函数

内联的S函数

为了让s -函数在Simulink环境中工作,会生成一些开销代金宝app码。当代码生成器从包含s -函数的模型中生成代码时(不包含s -函数)sfunction.tlc文件),它将一些开销代码嵌入到生成的代码中。如果您想优化实时代码并消除一些开销代码,那么您必须这样做内联(或嵌入)s函数。这包括编写TLC (sfunction.tlc)文件,以消除生成代码中的开销代码。目标语言编译器处理sfunction.tlc文件以定义如何在生成的代码中彻底解决S函数算法。

请注意

不要混淆这个词内联用C ++内联关键字。内联意味着指定文本来代替对通用的s -函数API例程的调用(例如,mdlOutputs).例如,当使用TLC文件内联s函数时,生成的代码包含通常出现在s函数例程中的C/ c++代码,以及已经从构建过程中删除的s函数本身。

完全环绕的S函数以与内置块无法区分的方式构建算法(块)到生成的代码中。通常,完全内向的S函数要求您实现算法两次:一次用于Simulink模型(C / C ++ MEX S-Function),一次用于代码生成(TLC文件)。金宝appTLC文件的复杂性取决于您算法的复杂性和您尝试在生成的代码中实现的效率水平。TLC文件在结构中从简单到复杂。看内联的S函数

用于遗留或自定义代码的自动生成的S函数

如果您需要在您的模型中调用手写的C/ c++代码,请考虑使用Simulink遗留代码工具。金宝app遗留代码工具可以根据您在遗留代码工具数据结构中注册的信息自动生成完全内联的s -函数和相应的TLC文件。

有关更多信息,请参阅使用遗留代码工具集成C函数看看使用遗留代码工具将外部代码导入外部代码的调用

实现非束缚和内联的S函数所需的文件

本主题简要介绍了创建非inlined和Inlined S函数所需的文件和函数。

  • 非内联s -函数需要C或c++ MEX s -函数源代码(sfunction.csfunction. cpp).

  • 完全内联的s函数需要一个sfunction.tlc文件。全内联s函数产生参数化s函数的最优代码。这是一个s函数,它以特定的模式运行,依赖于固定的s函数参数,这些参数在模型执行期间不会改变。对于给定的操作模式,sfunction.tlcFile指定为实现该模式的算法而生成的确切代码。例如,直接索引查找表s -函数用mdlRTW例程编写完全内联的s -函数包含两个操作模式 - 一个均匀间隔x数据一个是不均匀间隔的x数据

    请注意

    为调用遗留代码或自定义C/ c++代码而生成的完全内联s -函数也需要sfunction.tlc文件,由遗留代码工具生成。

完全环绕的S函数可能需要放置mdlrtw.在您的s函数mex文件中的例程sfunction.csfunction. cpp.的mdlrtw.例行程序可以让你放置信息模型.rtw.模型.rtw.是指定模型的记录文件,代码生成器在执行之前调用目标语言编译器处理哪个sfunction.tlc在生成代码。

包括一个mdlrtw.当您希望将不可调音参数引入TLC文件时,例程非常有用。这些参数用于确定哪种操作模式在S函数的给定实例中是活动的。基于此信息,S函数的TLC文件可以为该操作模式生成高效,最佳代码。

编写支持代码生成的s -函数的指南金宝app

  • 可以使用C/ c++ MEX、MATLAB语言和Fortran MEX s -函数进行代码生成。

  • 您可以通过提供内联TLC文件来内联s -函数以进行代码生成。参见S-Function内联目标语言编译器.MATLAB和Fortran MEX s函数必须内联。C/ c++ MEX s -函数可以内联以提高代码效率,也可以非内联。

  • 要自动生成用于调用遗留或自定义代码的完全内向的C MEX S函数,请使用遗留代码工具。有关更多信息,请参阅使用遗留代码工具集成C函数看看使用遗留代码工具将外部代码导入外部代码的调用

  • 例如,如果代码效率不是覆盖考虑,例如,如果您是快速原型设计,则可以选择不为C / C ++ MEX S函数内联。有关更多信息,请参阅编写非束缚的S函数

相关的话题