Write Fully Inlined S-Functions
A fully inlined S-function builds your algorithm (block) into generated code that you cannot distinguish from a built-in block. Typically, a fully inlined S-function requires you to implement your algorithm twice: once for the Simulink model (C/C++ MEX S-function) and once for code generation (TLC file).
Using the example in Write Wrapper S-Function and TLC Files, you can eliminate the
call to my_alg
entirely by specifying the explicit code (that is,
2.0 * u
) in wrapsfcn.tlc
. While this can
improve performance, if you are working with a large
amount of C/C++ code, the task can be lengthy. You also have to maintain your algorithm
in two places, the C/C++ S-function itself and the corresponding TLC file. Consider
whether the performance gains might outweigh the
disadvantages. To inline the algorithm used in this example, in the
Outputs
section of your wrapsfcn.tlc
file,
instead of writing:
%<y> = my_alg(%<u>);
Use:
%<y> = 2.0 * %<u>;
This code is the code produced in 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; }
The Target Language Compiler replaces the call to my_alg
with the
algorithm itself.
Multiport S-Function
A more advanced multiport inlined S-function example is sfun_multiport.c
and sfun_multiport.tlc
. This S-function illustrates how to
create a fully inlined TLC file for an S-function that contains multiple
ports.
Guidelines for Writing Inlined S-Functions
Consider using the block property
RTWdata
(see S-Function RTWdata). This property is a structure of character vectors that you can associate with a block. The code generator saves the structure with the model in the
file and makes themodel
.rtw.rtw
file more readable. For example in the MATLAB Command Window, suppose you enter these commands:mydata.field1 = 'information for field1'; mydata.field2 = 'information for field2'; set_param(sfun_block, 'RTWdata', mydata);
The
.rtw
file that the code generator produces for the block includes the comments specified in the structuremydata
.Consider using the
mdlRTW
function to inline your C MEX S-function in the generated code for:Renaming tunable parameters in the generated code.
Introducing non-tunable parameters into a TLC file.