exponenta event banner

Сокращение количества копий данных для блоков назначения шины

Для моделей, содержащих блок назначения шины, генератор кода, по возможности, использует одну и ту же переменную для ввода и вывода блока. Повторное использование этих переменных уменьшает количество копий данных, экономит ОЗУ и увеличивает скорость выполнения кода.

Пример модели

Например, в bus_assignoptimсигнал шины, содержащий шесть элементов, подается в блок назначения шины и блок выбора шины. Блок назначения шины присваивает новые значения элементу шины a1_real_array. Этот сигнал шины подается в Out1.

Создание кода без оптимизации

Создание кода без оптимизации путем установки для параметра «Выполнение обновления по месту» для блоков назначения и назначения шины значения 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.

Создание кода с оптимизацией

Создайте код с оптимизацией, установив для параметра Выполнить обновления по месту для блоков назначения и назначения шины значение 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.

См. также

Связанные темы