文档

s -函数和代码生成

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

  • 表示自定义算法

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

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

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

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

用于编写s函数的应用程序接口(API)允许您在Simulink环境中以极大的灵活性实现泛型算法。金宝app如果您打算在一个模型中使用s函数来生成代码,那么灵活性的级别可以有所不同。例如,无法访问MATLAB®与代码生成器一起使用的s函数。本主题解释了使用s函数时需要注意的条件。但是,使用本主题中介绍的技术,可以为使用生成的代码的大多数应用程序创建s函数。

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

本节以理解以下概念为前提:

  • 2级S-functions

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

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

笔记

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

s函数的类型

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

  1. “我不关心效率。我想写一个版本的算法,让它在Simulink和代码生成器产品中自动工作。”下载188bet金宝搏金宝app

  2. “我想在Simulink和代码生成器产品中实现一个高度优化的算法,看起来像一个内置块,并生成高效的代码。”下载188bet金宝搏金宝app

  3. “我有很多手写的代码需要接口。我想从Simulink和代码生成器产品中高效地调用我的函数。”下载188bet金宝搏金宝app

上述情况分别映射到下面的MathWorks®术语:

  1. Noninlined s函数

  2. 内联函数

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

Noninlined S-Functions

非内联s函数是一个C或c++ MEX s函数,它被Simulink引擎和生成的代码视为相同的。金宝app通常,根据s函数API实现算法一次。Simu金宝applink引擎和生成的代码调用s函数例程(例如,mdlOutputs)在模型执行期间。

每个非内联S-Function块的实例都需要额外的内存和计算资源。然而,这种将算法合并到模型和代码生成应用程序中的惯例在项目的原型设计阶段是很典型的,在这个阶段,效率并不重要。放弃效率的好处是能够迅速改变模型参数和结构。

编写非内联s函数不涉及TLC编码。非内联s函数是构建过程的默认情况,在某种意义上,一旦在模型中构建了MEX s函数,在按下之前就没有额外的准备工作了Ctrl + B建立你的模型。

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

内联S-Functions

为了让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函数),一次用于代码生成(TLC文件)。金宝appTLC文件的复杂性取决于算法的复杂性以及您试图在生成的代码中实现的效率级别。TLC文件的结构从简单到复杂不等。看到内联S-Functions

为遗留或自定义代码自动生成s函数

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

有关更多信息,请参见使用遗留代码工具集成C函数(金宝appSimulink)看看使用遗留代码工具将对外部代码的调用导入生成的代码中

实现非内联和内联s函数所需的文件

本主题简要介绍创建非内联和内联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-function墨西哥文件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函数(金宝appSimulink)看看使用遗留代码工具将对外部代码的调用导入生成的代码中

  • 如果代码效率不是最重要的考虑因素,例如,如果您正在快速创建原型,您可以选择不内联C/ c++ MEX s函数。有关更多信息,请参见编写非内联的S-Function

相关的话题