文件

内联S-Functions

内联的函数

内联函数方法为S-Function块提供TLC文件,该文件将替换C,C ++,Fortran或MATLAB®在模拟过程中使用的块的语言版本。

非束缚的S函数

如果未提供联合TLC文件,则大多数目标通过重新编译块的C MEX S函数来支持块。金宝app如前所述,在使用C / C ++编码的S函数和有限的子集时,内存使用和速度有开销mx *在代码生成器上下文中金宝app支持API调用。如果您想要最有效的生成代码,则必须通过为它们编写TLC文件而导致S函数。

当仿真需要为S-function块执行其中一个函数时,它会调用该函数的mex -文件。当代码生成器执行一个非内联s函数时,它以类似的方式执行,如图所示。

内林的类型

定义两类内联是有帮助的:

  • 完全内联S-functions

  • 包装内联S-functions

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

第二个示例使用包装器TLC文件。这个例子没有在适当的地方生成算法代码,而是调用一个包含代码体的C函数。使用包装器TLC文件有几个潜在的好处:

  • 它为C MEX S函数和生成的代码提供了一种共享C代码的方式。您无需两次编写代码。

  • 被调用的C函数是一个优化的例程。

  • 模型中可能存在几个块,并且在代码大小方面更有效,以使它们调用函数,而不是每个创建相同的算法代码。

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

完全内联的s函数示例

内联S函数提供了一种机制,可以将S函数块的代码直接嵌入到模型的生成的代码中。不通过函数指针调用单独的源文件并保持单独的数据结构(酝酿),代码将“内联”显示,如下图所示。

S函数timestwo.c.提供了一个完全内联的s函数的简单示例。这个块将它的输入乘以2然后输出。该块的C MEX版本在文件中matlabroot/工具箱/ sim金宝appulink / simdemos / simfeatures / src /timestwo.c.,块的内联TLC文件是matlabroot/工具箱/ sim金宝appulink / simdemos / simfeatures / tlc_c /timestwo.tlc.

timestwo.tlc.

%实现“Timestwo”“C”%%功能:输出========================================== %%%函数输出(块,系统)输出/ *%块:% * / %% / *乘以两个* /%分配rollvars = [“U”,“y“]%roll idx = rollregions,lcv = rollthreshold,块,”滚子“,rollvars% = \%* 2.0;%Endroll%Endfunction

TLC块分析

%实现指令是TLC块文件所要求的,目标语言编译器使用它来验证块类型和块支持的语言。金宝app这%的功能指令启动函数声明并显示函数名,输出,并将参数传递给它,系统.这些是相关的记录模型.rtw块的这个实例的文件。

原型机的最后一个部件是输出.这意味着任何不是TLC指令的行都会通过TLC中选择的当前文件的函数输出。所以,非展望线输出函数成为块的生成代码。

这个TLC块示例中最复杂的作品是%卷指示。TLC使用该指令提供自动生成循环,根据输入/输出宽度以及输入在内存中是否连续。此示例使用典型的访问输出和从卷筒体内输入的输入,使用LibBlockOutputSignalLibBlockInputSignal访问输出和输入,并执行乘法和赋值。注意,这个TLC文件支持任何有效的信号宽度。金宝app

用于实现此块的唯一函数是输出.对于更复杂的块,还声明了其他功能。您可以在文件夹中找到更复杂的内联TLC文件的示例matlabroot/工具/模型/ s金宝appimdemos / simfeatures / tlc_c打开),matlabroot/ / tlc_c金宝app工具箱/模型/块打开),并通过查看文件夹中内置块的代码matlabroot / rtw / c / tlc /块打开).

timestwo模型

这个简单的模型使用了timestwos函数,表示MdlOutputs函数生成的模型.c文件,其中包含内联的s函数代码。

模型输出代码

/*模型输出函数*/ static void timestwo_ex_output(int_T tid) {/* S-Function Block: /S-Function */ /* input乘以2 */ timestwo_ex_B. */timestwo_output = timestwo_ex_P。Constant_Value * 2.0;/* Outport: '/Out1'着干活= timestwo_ex_B.timestwo_output;}

包装器内联的S函数示例

下图演示了将s函数内联为包装器。从生成的模型代码中直接调用该算法,消除了s函数开销,但维护了用户函数。

的包装器版本的内联TLC文件timestwo堵塞。

%实现“Timestwo”“C”%%功能:BlockTypesetup ================================== %%%函数blocktypesetup(块,系统)void %%将功能原型添加到模型的头文件% %%添加包含的文件“myfile”要编译的文件列表%%端函数%%功能:输出========================================== %%%函数输出(块,系统)输出/ *%块:% * /%分配outptr = libblockoutputsignaladdr(0,“,”,“,0)%分配inptr = libblockinputsignaladdr(0,”,“,”,“,0)%分配numels = libblockoutputsignalwidth(0)/ *乘以两个* / mytimestwo(%,%,%);%Endfunction.

分析

这个函数blocktypesetup.为模型中的每种类型的块调用一次;它不像输出功能。用blocktypesetup.将函数原型包含在模型.h文件并告诉构建过程编译其他文件,myfile.c.

不是直接进行乘法运算,而是输出功能现在调用函数mytimestwo.模型中此块的所有实例都调用相同的功能来执行乘法。由此产生的模型功能,MdlOutputs,然后就

static void timestwo_ex_output(int_T tid) {/* S-Function Block: /S-Function */ /* input乘以2 */ mytimesttwo (& . .模型_B。Constant_Value, &模型_B.S_Function, 1);/* Outport Block: /Out1 */模型_Y吗。着干活=模型_b.s_function;}

相关的话题