主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

减少生成代码中 Bus Assignment 模块的数据副本

对于包含 Bus Assignment 模块的模型,如果可能,代码生成器会使用相同的变量作为模块的输入和输出。重用这些变量可以减少数据复制、节省 RAM 消耗并提高代码执行速度。

示例模型

例如,在 bus_assignoptim 中,包含六个元素的总线信号馈入 Bus Assignment 模块和 Bus Selector 模块。Bus Assignment 模块为总线元素 a1_real_array 分配新值。该总线信号馈入 Out1

生成不带优化的代码

通过将为 Assignment 和 Bus Assignment 模块执行就地更新参数设置为 off 来生成不带优化的代码。如果没有优化,bus_assignoptim_step 函数包含以下代码:

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];
  }
}
生成的代码包含临时数组 rtb_Assignment,用于在将数据分配给 bus_assignoptim_Y.Out.a1_real_array 之前保存数据。

生成优化代码

通过将为 Assignment 和 Bus Assignment 模块执行就地更新参数设置为 on 来生成优化的代码。优化后,bus_assignoptim_step 函数包含以下代码:

/* 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' */
}
生成的代码不包含用于保存数据的临时数组 rtb_Assignment1。生成的代码直接将该数据分配给 bus_assignoptim_Y.Out.a1_real_array

另请参阅

主题