Для моделей, содержащих блок Bus Assignment, если это возможно, генератор кода использует ту же переменную для входа и выхода блока. Повторное использование этих переменных уменьшает копии данных, сохраняет потребление оперативной памяти и увеличивает скорость выполнения кода.
Для примера, в bus_assignoptim
сигнал шины, содержащий шесть элементов, поступает в блок Bus Assignment и блок Bus Selector. Блок Bus Assignment присваивает новые значения элементу шины a1_real_array
. Этот сигнал шины поступает в Out1
.
Сгенерируйте код без оптимизации, установив параметр Perform in-place updates for Assignment and Bus Assignment blocks равным 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
. Сгенерируйте код с оптимизацией путем установки параметра Perform in-place updates for Assignment and Bus Assignment blocks на 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
.Выполните обновления на месте для блоков назначения и назначения шины