主要内容

内联的S函数

内含S函数

内联s函数意味着为s函数块提供TLC文件,该文件将取代C、c++、Fortran或MATLAB®在模拟期间使用的块的语言版本。

Noninlined s函数

如果没有提供内联TLC文件,大多数目标通过为块重新编译C MEX s函数来支持块。万博1manbetx如前所述,当使用C/ c++编码的s函数和有限的子集时,在内存使用和速度方面有开销MX *代码生成器上下文中支万博1manbetx持的API调用。如果您想要最有效的生成代码,您必须通过为它们编写TLC文件来内联s函数。

当模拟需要执行S函数块的一个函数时,它调用该函数的MEX文件。当代码生成器执行非束缚的S函数时,如此图所示,它以类似的方式执行。

内林的类型

定义两类内林有助于:

  • 完全环的S函数

  • 包装纸内联的S函数

虽然这两种方法都内联了s函数并消除了非内联s函数的开销,但它们是不同的。下面的第一个例子,使用timestwo.tlc,被认为是一个完全环绕的TLC文件,其中块的完整实现包含在块的TLC文件中。

第二个示例使用包装器TLC文件。此示例而不是生成算法代码到位,而是调用包含代码主体的C函数。使用Wrapper TLC文件有几个潜在的好处:

  • 它为C MEX s函数和生成的代码提供了共享C代码的方法。您不需要编写两次代码。

  • 被叫的C函数是优化的例程。

  • 模型中可能存在几个块,就代码大小而言,让它们调用一个函数比每个块创建相同的算法代码更有效。

  • 它提供了一种将遗留C代码无缝地合并到生成代码中的方法。

完全内向的S函数示例

内联s函数提供了一种机制,可以直接将s函数块的代码嵌入到为模型生成的代码中。而不是通过函数指针调用一个单独的源文件,并维护一个单独的数据结构(SimStruct)对于它而言,代码显示为“内向”,如下图所示。

的功能timestwo.c提供完全内向的S函数的简单示例。此块将其输入乘以2并输出它。块的C Mex版本位于文件中matlabroot./工具/模型/ s万博1manbetximdemos / simfeatures / src /timestwo.c,该块的内联TLC文件为matlabroot./工具/模型/ s万博1manbetximdemos / simfeatures / tlc_c /timestwo.tlc

timestwo.tlc

%实现“timestwo”“C”% %功能:输出  ========================================== %% % 函数输出(块、系统)输出/ * % <类型>块:% */ % /* input乘以2 */ %assign rollVars = ["U", "Y"] %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars % * 2.0;% endroll % endfunction

TLC块分析

%实现TLC块文件需要指令,并由目标语言编译器使用,以验证块支持的块类型和语言。万博1manbetx的%功能指令启动函数声明并显示函数的名称,输出,传递给它的参数,堵塞系统。这些是来自的相关记录模型.rtw.文件为此块的此实例。

最后一块原型是输出。这意味着任何不是TLC指令的行都由函数输出到TLC中选择的当前文件中。非指令行输出函数成为该块的生成代码。

这个TLC块示例中最复杂的部分是%卷指令。TLC使用此指令自动生成为了循环,这取决于输入/输出宽度以及输入在内存中是否连续。此示例使用从卷体内部访问输出和输入的典型形式,使用libblockoutputsignal.libblockinputsignal.访问输出和输入并执行乘法和分配。请注意,此TLC文件支持任何有效的信号宽度。万博1manbetx

用于实现此块的唯一功能是输出。对于更复杂的块,还声明了其他函数。您可以在文件夹中找到更复杂的内联TLC文件的例子matlabroot./工具箱/ sim万博1manbetxulink / simdemos / simfeatures / tlc_c(开放) 和matlabroot./工具箱/ sim万博1manbetxulink / blocks / tlc_c(开放),并查看文件夹中内置块的代码Matlabroot / RTW / C / TLC /块(开放)。

Timestwo模型

这个简单的模型使用Timestwo.s函数并显示mdloutputs.从生成的功能模型。c文件,包含内联的S函数代码。

模型输出代码

/ *模型输出功能* /静态void timestwo_ex_output(int_t tid){/ * s函数块: / s函数* // *乘以两个* / timestwo_ex_b.timestwo_output = timestwo_ex_p.constant_value * 2.0;/ *出口:' / out1'* / timestwo_ex_y.out1 = timestwo_ex_b.timestwo_output;}

包装器内联s函数示例

下图说明将S函数与包装器的内部函数。从生成的模型代码直接调用算法,从而删除S函数开销,但保持用户函数。

这是一个包装纸版本的内联TLC文件Timestwo.块。

BlockTypeSetup(block, system) void %%添加函数原型到模型的头文件% %%添加包含"myfile"的文件到要编译的文件列表% %endfunction %% Function: Outputs ========================================== %% % Function Outputs(block, system) Output /* % block:% */ %assign outPtr = LibBlockOutputSignalAddr(0, "", ", ",0) %assign numEls = LibBlockOutputSignalAddr(0, "", ", ",0) %assign numEls = LibBlockOutputSignalAddr(0, "", ",0) %assign numEls = LibBlockOutputSignalWidth(0) /*输入乘以2 */ mytimestwo(%,%,%);% endfunction

分析

功能BlockTypeSetup为模型中的每种类型的块调用一次;它不会直接产生输出输出函数。使用BlockTypeSetup包括函数原型模型。h文件,并告诉构建过程编译另一个文件,myfile.c

而不是直接执行乘法输出函数现在调用该函数mytimestwo.。模型中此块的所有实例都调用相同的函数来执行乘法。得到的模型函数,mdloutputs.然后变成了

静态void timestwo_ex_output(int_t tid){/ * s函数块: / s-function * // *乘以两个* / mytimestwo(&模型_B.Constant_Value,&模型_b.s_function,1);/ *出口块: / out1 * /模型_y.out1 =模型_B.S_Function;}

相关话题