主要内容

内联S-Functions

写作S-functions被包括在生成的代码涉及到需求超出写作S-functions仅用于模拟。在你进行内联函数确保它符合需求和功能正常。有关更多信息,请参见S-Functions和代码生成。如果你的s函数多重速率的,看到的基于时间的调度和代码生成对于多任务执行建模,率分组遵从性和兼容性问题(嵌入式编码)

内联S-Functions块目标文件

什么时候内联S-Functions

与C墨西哥人S-functions non-ERT目标支持调用原始C墨西哥人代码万博1manbetx如果源代码(。c当进入构建阶段文件)是可用的。的S-functions Fortran或MATLAB®语言,你必须内联他们有完整的代码生成模型万博1manbetx®模型包含它们。此外,一旦你已经确定,你将内联函数,您必须决定让它完全内联或包装。

完全内联S-Functions

完全的阻止目标文件内联函数是一个自包含的定义如何内联块的功能直接生成代码的各个部分——开始代码,输出代码等。这种方法是最有益的,当有许多模式和数据类型支持算法相对较小或当代码大小并不重要。万博1manbetx

基于函数的、或包装代码生成

当代码的物理尺寸为内联块变得太大,目标文件写入块收集输入,输出,和参数,调用一个函数,你写来执行块功能。这一个优势在生成的代码大小函数中的代码非常大或者有很多这一块模型的实例。当然,你应该考虑函数调用的开销,当重完全内联块算法的选择或生成函数调用。

如果你选择和基于函数的代码生成两个更多的选择需要考虑:

  • 编写函数,把它们放在。c文件和TLC代码的BlockTypeSetup方法指定外部引用您的支持功能。万博1manbetx使用LibAddToModelSources包含支持功能的模块的名称。万博1manbetx这种方法通常是使用一个函数完成每个文件得到最小的可执行的可能。

  • 写一个更复杂的薄层色谱文件。除了方法等开始输出,有条件地生成定制版本的功能(数据类型、宽度算法,等等),在单独的代码生成缓冲区,写入到一个单独的。c文件。这个模型所使用的文件应该只包含函数,而不是所有可能的功能。

方法可以产生最佳的代码。第一个选项会导致成百上千的文件如果你的s函数支持许多数据类型,信号宽度,算法的选择。万博1manbetx第二种方法是更难写,但结果更易于维护的代码生成库,和代码可以一样的第一种方法。

对包装进行进一步的信息,请参阅包装内联函数示例

内联MATLAB文件S-Functions

你可以内联S-functions MATLAB文件生成的代码的功能。的过程写一块目标文件为MATLAB文件s函数本质上是相同的过程写C墨西哥人功能。

请注意

虽然您可以完全内联MATLAB文件功能来提高性能,万博1manbetx仿真软件加速器™或代码生成器并不包括C或c++ API的MATLAB数学库。因此不能从TLC文件调用MATLAB数学库函数。

下面的例子说明了C的等价墨西哥人,MATLAB文件S-functions代码生成。MATLAB的s函数文件timestwo.m相当于C墨西哥人功能timestwo。墨西哥人的TLC文件C s函数timestwoMATLAB文件工作的功能timestwo.m。薄层色谱是独立于类型的功能,因为TLC只需要根s函数,而不是它的类型的名称。在的情况下timestwo,一行决定了代码生成器实现了TLC文件:

%实现“timestwo”“C”

试试这个:

  1. 创建以下示例模型:

  2. 复制文件timestwo.m从文件夹中matlabroot/工具/模型/ s万博1manbetximdemos / simfeatures(开放)到一个临时文件夹中。

  3. 复制文件timestwo.tlc从文件夹中matlabroot/工具/模型/ s万博1manbetximdemos / simfeatures / tlc_c(开放)相同的临时文件夹。

  4. 在MATLAB中,改变文件夹(cd)到临时文件夹,使仿真软件模型的功能块调用万博1manbetxtimestwo。

  5. 信号的属性标签尺寸块的参数对话框中,设置港维参数5

万博1manbetx仿真软件MATLAB使用MATLAB仿真文件功能,因为搜索路径发现timestwo.m在当前文件夹之前找到C墨西哥人功能timestwomatlabpath。验证该功能代码生成器使用通过输入MATLAB命令:

这timestwo

答案是MATLAB文件功能timestwo.m在临时文件夹中。

在生成的代码中,timestwo.tlc文件内联MATLAB文件功能。

/ *功能(timestwo):‘< Root > / MATLAB函数* / / *输入乘以两个* / {int_T i1;const real_T *情况= ×2_B.Gain [0];real_T * y0 = ×2_Y.Out1 [0];(i1 = 0;i1 < 5;i1 + +) {y0 (i1) =情况(i1) * 2.0;}}

每个输入的输出产品,情况(i1)乘以2.0。代码生成器使用这个输出方法从目标文件来生成代码块:

%函数输出(块,系统)输出/ * % <类型>块:% <名称> * / % % / *输入乘以两个* / %分配rollVars = [“U”、“Y”] %辊idx = RollRegions lcv = RollThreshold,块,“滚”,rollVars % < LibBlockOutputSignal(0”“液位控制阀,idx) > = \ % < LibBlockInputSignal(0”“液位控制阀,idx) > * 2.0;% endroll % endfunction

改变这些临时副本的MATLAB文件功能和TLC文件,看看他们是如何交互的。开始通过改变TLC文件中的注释和看到的变化出现在生成的代码中。然后,工作算法变化。

更多信息内联C墨西哥人S-Functions,明白了内联C墨西哥人S-Functions

内联Fortran S-Functions (F-MEX)

Fortran墨西哥人的能力S-functions可以完全用TLC内联块目标文件。这个接口可以用Fortran墨西哥人s函数实现timestwo函数。这是样品Fortran s函数代码:

C C FTIMESTWO。对于C C C一个样本的FORTRAN表示C timestwo s函数。C 1990 - 2000版权MathWorks公司C C = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = C函数:大小尺寸C C文摘:C组向量。C C C大小返回一个向量决定模型的特点。这个向量包含C C状态向量的大小和其他参数。更准确地说,C C(1)连续状态的数目大小(2)数量的离散状态C C(3)的输出大小(4)数量的输入C的大小(5)数量的不连续起源于C系统C的大小(6)设置为1,如果系统有直接C引线的输入,否则0 C C = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =子例程大小(尺寸)C . .数组参数。整数大小(*)* 4 C . .参数. .整数* 4 NSIZES参数(NSIZES = 6)尺寸(1)= 0(2)= 0(3)= 1大小(4)= 1(5)= 0大小(6)= 1返回结束C C = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = C功能:输出C C文摘:C C执行输出计算连续信号。 C===================================================== C .. Parameters .. SUBROUTINE OUTPUT(T, X, U, Y) REAL*8 T REAL*8 X(*), U(*), Y(*) Y(1) = U(1) * 2.0 RETURN END C C===================================================== C Stubs for unused functions. C===================================================== SUBROUTINE INITCOND(X0) REAL*8 X0(*) C --- Nothing to do. RETURN END SUBROUTINE DERIVS(T, X, U, DX) REAL*8 T, X(*), U(*), DX(*) C --- Nothing to do. RETURN END SUBROUTINE DSTATES(T, X, U, XNEW) REAL*8 T, X(*), U(*), XNEW(*) C --- Nothing to do. RETURN END SUBROUTINE DOUTPUT(T, X, U, Y) REAL*8 T, X(*), U(*), Y(*) C --- Nothing to do. RETURN END SUBROUTINE TSAMPL(T, X, U, TS, OFFSET) REAL*8 T,TS,OFFSET,X(*),U(*) C --- Nothing to do. RETURN END SUBROUTINE SINGUL(T, X, U, SING) REAL*8 T, X(*), U(*), SING(*) C --- Nothing to do. RETURN END

前面的代码复制到文件中ftimestwo.for在一个方便的工作文件夹。

把这变成一个功能块在一个简单的模型将说明接口为内联函数。一旦你的Fortran墨西哥人环境设置,准备使用的代码编译功能在一个工作目录以及文件中万博1manbetxsimulink.for从文件夹中matlabroot/万博1manbetx模型/ src(开放)。关于设置的更多信息Fortran墨西哥人环境,明白了创建2级Fortran S-Functions

编译的代码墨西哥人在MATLAB命令行命令:

墨西哥人ftimestwo。对于si万博1manbetxmulink.for

现在参考物体从一个简单的模型与固定步解算器和设置目标。

内联的TLC代码块是一种修改的timestwo.tlc。在您的工作目录中,创建一个文件命名ftimestwo.tlc把这段代码。

%实现“ftimestwo”“C”%函数输出(块,系统)输出/ * % <类型>块:% <名称> * / % % / *输入乘以两个* / %分配rollVars = [“U”、“Y”] %辊idx = RollRegions lcv = RollThreshold,块,……“滚”,rollVars % < LibBlockOutputSignal(0”“液位控制阀,idx) > = \ % < LibBlockInputSignal(0”“液位控制阀,idx) > * 2.0;% endroll % endfunction

现在,您可以生成代码ftimestwoFortran墨西哥人功能。由此产生的特有的代码片段ftimestwo

/ *功能块:< Root > / F-MEX s函数* / / *输入乘以两个* / rtB。F_MEX_S_Function = rtB。获得* 2.0;

相关的话题