Main Content

编写完全内联的 S-Function

完全内联的 S-Function 将您的算法(模块)嵌入到生成的代码中,您不能将其与内置模块区分开来。通常,完全内联的 S-Function 需要实现两次算法:一次针对 Simulink 模型 (C/C++ MEX S-Function),一次针对代码生成(TLC 文件)。

使用编写包装器 S-Function 和 TLC 文件中的示例,您可以通过在 wrapsfcn.tlc 中指定显式代码(即 2.0 * u)完全消除对 my_alg 的调用。虽然这样可以提高性能,但如果您要处理大量 C/C++ 代码,这项任务可能很耗时。您还必须在两个地方维护算法:C/C++ S-Function 本身和对应的 TLC 文件。需要考虑所得到的性能增益能否大于它的弊端。要内联本示例中使用的算法,则在 wrapsfcn.tlc 文件的 Outputs 部分,请不要编写:

%<y> = my_alg(%<u>);

使用...

%<y> = 2.0 * %<u>;

以下代码是 mdlOutputs 中生成的代码:

void mdlOutputs(int_T tid)
{
  /* Sin Block: <Root>/Sin */
  rtB.Sin = rtP.Sin.Amplitude *
    sin(rtP.Sin.Frequency * ssGetT(rtS) + rtP.Sin.Phase);

  /* S-Function Block: <Root>/S-Function */
  rtB.S_Function = 2.0 * rtB.Sin; /* Explicit embedding of algorithm */

  /* Outport Block: <Root>/Out */
  rtY.Out = rtB.S_Function;
}

目标语言编译器使用算法本身代替对 my_alg 的调用。

多端口 S-Function

更高级的多端口内联 S-Function 示例是 sfun_multiport.csfun_multiport.tlc。此 S-Function 说明如何为包含多个端口的 S-Function 创建完全内联的 TLC 文件。

编写内联 S-Function 的规范

  • 考虑使用模块属性 RTWdata(请参阅S-Function RTWdata)。此属性是可与模块关联的字符向量结构体。代码生成器将此结构体与模型一起保存在 model.rtw 文件中,并使 .rtw 文件更易于阅读。例如,在 MATLAB 命令行窗口中,假设您输入以下命令:

    mydata.field1 = 'information for field1';
    mydata.field2 = 'information for field2';
    set_param(sfun_block, 'RTWdata', mydata);

    代码生成器为模块生成的 .rtw 文件包含结构体 mydata 中指定的注释。

  • 考虑使用 mdlRTW 函数在生成的代码中内联 C MEX S-Function 以用于以下目的:

    • 重命名生成的代码中的可调参数。

    • 在 TLC 文件中引入不可调参数。

相关主题