Contenido principal

Pass reusable subsystem outputs as

Control how a reusable subsystem passes outputs

Model Configuration Pane: Code Generation / Optimization

Description

The Pass reusable subsystem outputs as parameter specifies how a reusable subsystem passes outputs.

Settings

Individual arguments (default) | Structure reference
Individual arguments

Passes each reusable subsystem output argument as an address of a local, instead of as a pointer to an area of global memory containing the output arguments. This option reduces global memory usage and eliminates copying local variables back to global block I/O structures. When the signals are allocated as local variables, there may be an increase in stack size. If the stack size increases beyond a level that you want, use the default setting. By default, the maximum number of output arguments passed individually is 12. To increase the number of arguments, increase the value of the Maximum number of arguments for subsystem outputs parameter.

Structure reference

Passes reusable subsystem outputs as a pointer to a structure stored in global memory.

Note

The default option is used for reusable subsystems that have signals with variable dimensions.

Examples

expand all

For models containing a Bus Assignment block, if possible, the code generator uses the same variable for the block input and output. Reusing these variables reduces data copies, conserves RAM consumption and increases code execution speed.

For example, in bus_assignoptim, a bus signal containing six elements feeds into a Bus Assignment block and a Bus Selector block. The Bus Assignment block assigns new values to the bus element a1_real_array. This bus signal feeds into Out1.

Model that contains several blocks, including a Bus Assignment block.

Generate code without the optimization by setting the Perform in-place updates for Assignment and Bus Assignment blocks parameter to off. Without the optimization the bus_assignoptim_step function contains this code:

void bus_assignoptim_step(void)
{
  real_T rtb_Assignment[36];
  int32_T i;

  /* Assignment: '<Root>/Assignment' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   *  Product: '<Root>/Product'
   *  Selector: '<Root>/Selector'
   *  Sum: '<Root>/Sum1'
   */
  for (i = 0; i < 36; i++) {
    rtb_Assignment[i] = bus_assignoptim_U.In1.a1_real_array[i];
  }

  for (i = 0; i < 2; i++) {
    rtb_Assignment[(int32_T)(i + 22)] = (bus_assignoptim_U.In1.a1_real_array
      [(int32_T)(i + 22)] + bus_assignoptim_U.In1.a1_num) *
      bus_assignoptim_U.In2;
  }

  /* End of Assignment: '<Root>/Assignment' */

  /* Outport: '<Root>/Out' incorporates:
   *  BusAssignment: '<Root>/Bus Assignment'
   *  Inport: '<Root>/In1'
   */
  bus_assignoptim_Y.Out = bus_assignoptim_U.In1;

  /* BusAssignment: '<Root>/Bus Assignment' incorporates:
   *  Outport: '<Root>/Out'
   */
  for (i = 0; i < 36; i++) {
    bus_assignoptim_Y.Out.a1_real_array[i] = rtb_Assignment[i];
  }
}
The generated code contains the temporary array rtb_Assignment for holding data before this data is assigned to bus_assignoptim_Y.Out.a1_real_array.

Generate code with the optimization by setting the Perform in-place updates for Assignment and Bus Assignment blocks parameter to on. With the optimization, the bus_assignoptim_step function contains this code:

/* Model step function */
void bus_assignoptim_step(void)
{
  int32_T i;

  /* Outport: '<Root>/Out' incorporates:
   *  Inport: '<Root>/In1'
   *  SignalConversion: '<Root>/TmpBusAssignmentBufferAtBus AssignmentInport1'
   */
  bus_assignoptim_Y.Out = bus_assignoptim_U.In1;

  /* Assignment: '<Root>/Assignment' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   *  Outport: '<Root>/Out'
   *  Product: '<Root>/Product'
   *  Selector: '<Root>/Selector'
   *  Sum: '<Root>/Sum1'
   */
  for (i = 0; i < 36; i++) {
    bus_assignoptim_Y.Out.a1_real_array[i] =
      bus_assignoptim_U.In1.a1_real_array[i];
  }

  for (i = 0; i < 2; i++) {
    bus_assignoptim_Y.Out.a1_real_array[(int32_T)(i + 22)] =
      (bus_assignoptim_U.In1.a1_real_array[(int32_T)(i + 22)] +
       bus_assignoptim_U.In1.a1_num) * bus_assignoptim_U.In2;
  }

  /* End of Assignment: '<Root>/Assignment' */
}
The generated code does not contain the temporary array rtb_Assignment1 for holding data. The generated code directly assigns this data to bus_assignoptim_Y.Out.a1_real_array.

Recommended Settings

ApplicationSetting
DebuggingNo impact
TraceabilityNo impact
EfficiencyIndividual arguments (execution, RAM), Structure reference (ROM)
Safety precautionNo impact

Programmatic Use

Parameter: PassReuseOutputArgsAs
Type: character vector
Value: 'Structure reference' | 'Individual arguments'
Default: 'Individual arguments'

Version History

Introduced in R2009a