主要内容

带有TLC的内联s函数

timesN教程概述

摘要目的:为了理解TLC如何与s函数一起工作。

文件夹:matlabroot/工具箱/ rtw / rtwdemos / tlctutorial / timesN开放

在本教程中,您将为现有的s函数生成不同版本的C代码timesN

本教程包括以下步骤:

  1. 非内联代码生成-通过SimStructs和通用API

  2. 为什么使用TLC内联s函数?-内联的好处

  3. 创建一个内联S-Function-通过自定义TLC代码

后面的教程将提供有关“包装”s函数的信息和练习。

非内联代码生成

教程文件夹tlctutorial / timesN工作文件夹中包含Simulink®功能timesN.c

在本练习中,您将从模型生成非内联代码sfun_xN

  1. 查找文件rename_timesN.tlctlctutorial / timesN.将此文件重命名为timesN.tlc.这允许您生成代码。

  2. 在MATLAB中®命令窗口,为s函数创建一个mexo文件:

    墨西哥人timesN.c

    这避免了使用Simulink附带的版本。

  3. 打开模型sfun_xN,使用timesNs函数。框图是这样的。

  4. 打开“配置参数”对话框,并选择解算器窗格。

  5. 停止时间10.0

  6. 设置解算器选项

    • 类型固定步

    • 解算器离散(无连续状态)

    • 固定的大小0.01

  7. 选择优化窗格,确保默认参数行为设置为可调

  8. 选择代码生成>评论窗格,注意包括评论默认为勾选。

  9. 选择代码生成窗格和检查只生成代码

    点击应用

  10. 新闻Ctrl + B为模型生成C代码。

  11. 打开结果文件sfun_xN_grt_rtw / sfun_xN.c并查看sfun_xN_output部分,如下所示。

/*模型输出函数*/ static void sfun_xN_output(int_T tid) {/* Sin: '/Sin' */ sfun_xN_B. / /Sin = Sin (sfun_xN_M->定时。t[0] * sfun_xN_P。Sin_Freq + sfun_xN_P. sin_phase) * sfun_xN_P。Sin_Amp + sfun_xN_P.Sin_Bias;/* S-Function Block: /S-Function */ /* input乘以3.0 */ sfun_xN_B. / /* S-Function Block: timesN_output = sfun_xN_B。Sin * 3.0;/* Outport: '/Out' */ sfun_xN_Y. /* Outport: '/Out'Out = sfun_xN_B.timesN_output;UNUSED_PARAMETER (tid);}

注释出现在代码中是因为代码生成>评论窗格中的“配置参数”对话框,包括评论默认选中。

为什么使用TLC内联s函数?

代码生成器包括一个通用API,您可以使用它来调用用户编写的算法和驱动程序。API包括各种回调函数——用于初始化、输出、导数、终止等等——以及数据结构。一旦编码完成,就会在内存中实例化,并在执行期间通过间接函数调用进行调用。每次调用都涉及堆栈帧和其他增加执行时间的开销。

在实时环境中,特别是涉及许多解决方案步骤时,通用API调用可能慢得令人无法接受。代码生成器可以通过在自动生成的函数中嵌入用户编写的算法来加速独立应用程序中的s -函数,而不是通过通用API间接调用s -函数。这种形式的优化被称为内联.TLC内联s函数,导致更快,优化的代码。

您应该理解TLC并不是编写C代码s函数的替代品。要在Simulink中调用自定义块,您仍然必须用C(或作为MATLAB文件)编写s函数,因为模拟不使用TLC文件。但是,您可以准备TLC文件来内联指定的s -函数,从而使您的目标代码更加高效。

创建一个内联S-Function

TLC创建一个内联函数每当它检测到.tlc与s函数同名的文件。假设.tlc文件具有预期的形式,它指导代码的构造,在不引起API开销的情况下复制外部s函数。通过完成以下步骤了解这个过程是如何工作的:

  1. 如果您还没有这样做,请找到该文件rename_timesN.tlctlctutorial / timesN.将此文件重命名为timesN.tlc,因此您可以使用它来生成代码。文件的可执行部分为

    %实现“timesN”“C”% %功能:输出  =========================================================== %% % 函数输出(块、系统)输出%分配收益= SFcnParamSettings。myGain /* % Block: % */ %% /* Multiply input by % */ %assign rollVars = ["U", "Y"] %roll idx = RollRegions, lcv = RollThreshold, Block, "Roller", rollVars % = \ % * %;% endroll % endfunction
  2. 创建s函数的内联版本。

    1. 优化窗格的“配置参数”对话框中,设置默认参数行为内联,并单击应用

    2. 更改图表的标签模型:sfun_xN模型:sfun_xN_ilp

    3. 将模型另存为sfun_x2_ilp

    4. 新闻Ctrl + B.源文件创建在名为sfun_xN_ilp_grt_rtw

    5. 检查生成文件中的代码sfun_xN_ilp.c

      /*模型输出函数*/ static void sfun_xN_ilp_output(int_T tid) {/* Sin: '/Sin' */ sfun_xN_ilp_B. / /Sin = Sin (sfun_xN_ilp_M->Timing.t[0]);/* S-Function Block: /S-Function */ /* input乘以3.0 */ sfun_xN_ilp_B. / /* S-Function Block: /S-Function */ /* input乘以3.0 */ sfun_xN_ilp_B. /timesN_output = sfun_xN_ilp_B。Sin * 3.0;/* Outport: '/Out' */ sfun_xN_ilp_Y.输出端口:'/Out'Out = sfun_xN_ilp_B.timesN_output;UNUSED_PARAMETER (tid);}

      请注意

      当代码生成器生成代码并构建可执行文件时,它会创建或使用特定的子文件夹(称为构建文件夹)来保存源文件、对象文件和make文件。默认情况下,生成文件夹被命名模型_grt_rtw

      注意这个设置默认参数行为内联没有更改代码。这是因为TLC内联s函数。

  3. 通过创建一个独立的模拟继续练习。

    1. 代码生成窗格中的“配置参数”,清除只生成代码并点击应用

    2. 数据导入/导出窗格的“配置参数”对话框,选中输出

      该规范导致模型的输出数据被记录在MATLAB工作区中。

    3. 新闻Ctrl + B要生成代码、编译并将模型链接到名为sfun_xN_ilp.exe(或者,在UNIX上®系统中,sfun_xN_ilp).

    4. 确认timesN.tlc文件通过运行独立的可执行文件产生预期的输出。要运行它,请在MATLAB命令窗口中键入

      sfun_xN_ilp !

      界面显示如下:

      **启动模型** **创建sfun_xN_ilp。垫* *
    5. 控件的内容sfun_xN_ilp.mat文件来验证独立模型生成的正弦输出范围从-3到+3。在MATLAB命令窗口中,键入

      负载sfun_xN_ilp。Mat图(rt_yout)

提示

对于UNIX平台,在“命令窗口”中按如下语法运行可执行程序!。/executable_name.如果愿意,可以使用语法从操作系统外壳运行可执行程序./executable_name.有关更多信息,请参见运行外部命令、脚本和程序

相关的话题

Baidu
map