内联函数方法为S-Function块提供TLC文件,该文件将替换C,C ++,Fortran或MATLAB®在模拟过程中使用的块的语言版本。
如果未提供联合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函数timestwo.c.
提供了一个完全内联的s函数的简单示例。这个块将它的输入乘以2然后输出。该块的C MEX版本在文件中
,块的内联TLC文件是matlabroot
/工具箱/ sim金宝appulink / simdemos / simfeatures / src /timestwo.c.
.matlabroot
/工具箱/ sim金宝appulink / simdemos / simfeatures / tlc_c /timestwo.tlc.
%实现“Timestwo”“C”%%功能:输出========================================== %%%函数输出(块,系统)输出/ *%块:% * / %% / *乘以两个* /%分配rollvars = [“U”,“y“]%roll idx = rollregions,lcv = rollthreshold,块,”滚子“,rollvars% = \% * 2.0;%Endroll%Endfunction
这%实现
指令是TLC块文件所要求的,目标语言编译器使用它来验证块类型和块支持的语言。金宝app这%的功能
指令启动函数声明并显示函数名,输出
,并将参数传递给它,块
和系统
.这些是相关的记录
块的这个实例的文件。模型
.rtw
原型机的最后一个部件是输出
.这意味着任何不是TLC指令的行都会通过TLC中选择的当前文件的函数输出。所以,非展望线输出
函数成为块的生成代码。
这个TLC块示例中最复杂的作品是%卷
指示。TLC使用该指令提供自动生成为
循环,根据输入/输出宽度以及输入在内存中是否连续。此示例使用典型的访问输出和从卷筒体内输入的输入,使用LibBlockOutputSignal
和LibBlockInputSignal
访问输出和输入,并执行乘法和赋值。注意,这个TLC文件支持任何有效的信号宽度。金宝app
用于实现此块的唯一函数是输出
.对于更复杂的块,还声明了其他功能。您可以在文件夹中找到更复杂的内联TLC文件的示例
(打开),matlabroot
/工具/模型/ s金宝appimdemos / simfeatures / tlc_c
(打开),并通过查看文件夹中内置块的代码matlabroot
/ / tlc_c金宝app工具箱/模型/块
(打开).matlabroot / rtw / c / tlc /块
这个简单的模型使用了timestwo
s函数,表示MdlOutputs
函数生成的
文件,其中包含内联的s函数代码。模型
.c
/*模型输出函数*/ 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函数开销,但维护了用户函数。
的包装器版本的内联TLC文件timestwo
堵塞。
%实现“Timestwo”“C”%%功能:BlockTypesetup ================================== %%%函数blocktypesetup(块,系统)void %%将功能原型添加到模型的头文件%%%添加包含的文件“myfile”要编译的文件列表% %端函数%%功能:输出========================================== %%%函数输出(块,系统)输出/ *% 块:% * /%分配outptr = libblockoutputsignaladdr(0,“,”,“,0)%分配inptr = libblockinputsignaladdr(0,”,“,”,“,0)%分配numels = libblockoutputsignalwidth(0)/ *乘以两个* / mytimestwo(% ,% ,% );%Endfunction.
这个函数blocktypesetup.
为模型中的每种类型的块调用一次;它不像输出
功能。用blocktypesetup.
将函数原型包含在
文件并告诉构建过程编译其他文件,模型
.hmyfile.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;}