Этот пример показывает, как передача многоразовых выходов подсистемы как отдельных аргументов, а не как указателя на структуру, хранящуюся в глобальной памяти, оптимизирует сгенерированный код. Эта оптимизация сохраняет потребление ОЗУ и увеличивает скорость выполнения кода за счет уменьшения использования глобальной памяти и исключения копий данных из локальных переменных обратно в глобальные структуры ввода-вывода блоков.
Рассмотрим rtwdemo_reusable_sys_outputs модели. В этой модели выходы переиспользуемой подсистемы подают корневые выходы модели.
model = 'rtwdemo_reusable_sys_outputs';
open_system(model);
Сгенерируйте код для этой модели при передаче выходов подсистемы в качестве структурной ссылки. Создайте временную папку для процесса сборки и проверки.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
slbuild(model)
### Starting build procedure for: rtwdemo_reusable_sys_outputs ### Successful completion of build procedure for: rtwdemo_reusable_sys_outputs Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================================= rtwdemo_reusable_sys_outputs Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 21.862s
Фрагмент кода показывает фрагменты rtwdemo_reusable_sys_outputs.c
. Заметьте глобальную структуру ввода-вывода блоков, а в функции шага модели копию данных из этой структуры.
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; }
Откройте диалоговое окно Параметры конфигурации.
На панели Оптимизации установите значения выходов переиспользуемой подсистемы Pass Individual arguments
.
Также можно использовать API командной строки, чтобы включить оптимизацию:
set_param(model, 'PassReuseOutputArgsAs', 'Individual arguments');
С помощью этой оптимизации ReusableSubsystem
функция имеет три выходных аргументов, которые являются прямыми ссылками на внешние выходы. The rtDW
глобальная структура больше не существует, и копии данных из этой структуры в rtY
(внешние выходы) структура не находится в сгенерированном коде.
Создайте модель.
slbuild(model)
### Starting build procedure for: rtwdemo_reusable_sys_outputs ### Successful completion of build procedure for: rtwdemo_reusable_sys_outputs Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================ rtwdemo_reusable_sys_outputs Code generated and compiled Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.419s
Фрагмент кода ниже является частью 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)
Передайте выходные выходы переиспользуемой подсистемы как