Этот пример показывает, как, передавая допускающую повторное использование подсистему выходные параметры в качестве отдельных аргументов вместо как указатель на структуру, сохраненную в глобальной памяти, оптимизируют сгенерированный код. Эта оптимизация сохраняет потребление RAM и увеличивает скорость выполнения кода путем сокращения использования глобальной памяти и устранения копий данных с локальных переменных назад к глобальным структурам блока I/O.
Рассмотрите модель rtwdemo_reusable_sys_outputs. В этой модели допускающая повторное использование подсистема выводит, питают корневые выходные параметры модели.
model = 'rtwdemo_reusable_sys_outputs';
open_system(model);

Сгенерируйте код для этой модели в то время как передающая подсистема выходные параметры как ссылка структуры. Создайте временную папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
rtwbuild(model)
### Starting build procedure for model: rtwdemo_reusable_sys_outputs ### Successful completion of build procedure for model: rtwdemo_reusable_sys_outputs
Фрагмент кода показывает фрагменты rtwdemo_reusable_sys_outputs.c. Заметьте глобальную структуру блока I/O и в образцовой ступенчатой функции копия данных с этой структуры.
cfile = fullfile(cgDir,'rtwdemo_reusable_sys_outputs_ert_rtw',... 'rtwdemo_reusable_sys_outputs.c'); rtwdemodbtype(cfile,'/* Output and update for atomic system',... '/* Model initialize', 1, 0);
/* Output and update for atomic system: '<Root>/ReusableSubsystem' */
static void ReusableSubsystem(real_T rtu_In1, real_T rtu_In2, real_T rtu_In3,
DW_ReusableSubsystem *localDW)
{
/* Gain: '<S1>/Gain' */
localDW->Gain = 5.0 * rtu_In1;
/* Gain: '<S1>/Gain1' */
localDW->Gain1 = 6.0 * rtu_In2;
/* Gain: '<S1>/Gain2' */
localDW->Gain2 = 7.0 * rtu_In3;
}
/* Model step function */
void rtwdemo_reusable_sys_outputs_step(void)
{
/* Outputs for Atomic SubSystem: '<Root>/ReusableSubsystem' */
/* Inport: '<Root>/In1' incorporates:
* Inport: '<Root>/In2'
* Inport: '<Root>/In3'
*/
ReusableSubsystem(rtU.In1, rtU.In2, rtU.In3, &rtDW.ReusableSubsystem_d);
/* End of Outputs for SubSystem: '<Root>/ReusableSubsystem' */
/* Outport: '<Root>/Out1' */
rtY.Out1 = rtDW.ReusableSubsystem_d.Gain;
/* Outport: '<Root>/Out2' */
rtY.Out2 = rtDW.ReusableSubsystem_d.Gain1;
/* Outport: '<Root>/Out3' */
rtY.Out3 = rtDW.ReusableSubsystem_d.Gain2;
}
Откройте диалоговое окно Configuration Parameters.
На панели Оптимизации, Передача набора допускающая повторное использование подсистема выходные параметры относительно Individual arguments.
Также можно использовать API командной строки, чтобы включить оптимизацию:
set_param(model, 'PassReuseOutputArgsAs', 'Individual arguments');
С этой оптимизацией функция ReusableSubsystem имеет три выходных аргумента, которые являются прямыми ссылками к внешним выходным параметрам. Глобальная структура rtDW больше не существует, и копии данных от этой структуры до rtY (внешние выходные параметры), структура не находится в сгенерированном коде.
Создайте модель.
rtwbuild(model)
### Starting build procedure for model: rtwdemo_reusable_sys_outputs ### Successful completion of build procedure for model: rtwdemo_reusable_sys_outputs
Фрагмент кода ниже является фрагментом rtwdemo_reusable_sys_outputs.c. Наблюдайте оптимизированный код.
rtwdemodbtype(cfile,'/* Output and update for atomic system',... '/* Model initialize', 1, 0);
/* Output and update for atomic system: '<Root>/ReusableSubsystem' */
static void ReusableSubsystem(real_T rtu_In1, real_T rtu_In2, real_T rtu_In3,
real_T *rty_Out1, real_T *rty_Out2, real_T *rty_Out3)
{
/* Gain: '<S1>/Gain' */
*rty_Out1 = 5.0 * rtu_In1;
/* Gain: '<S1>/Gain1' */
*rty_Out2 = 6.0 * rtu_In2;
/* Gain: '<S1>/Gain2' */
*rty_Out3 = 7.0 * rtu_In3;
}
/* Model step function */
void rtwdemo_reusable_sys_outputs_step(void)
{
/* Outputs for Atomic SubSystem: '<Root>/ReusableSubsystem' */
/* Inport: '<Root>/In1' incorporates:
* Inport: '<Root>/In2'
* Inport: '<Root>/In3'
* Outport: '<Root>/Out1'
* Outport: '<Root>/Out2'
* Outport: '<Root>/Out3'
*/
ReusableSubsystem(rtU.In1, rtU.In2, rtU.In3, &rtY.Out1, &rtY.Out2, &rtY.Out3);
/* End of Outputs for SubSystem: '<Root>/ReusableSubsystem' */
}
Закройте модель и очистку.
bdclose(model) rtwdemoclean; cd(currentDir)
Передайте допускающую повторное использование подсистему выходные параметры как