Этот пример показывает, как Simulink ® Coder™ оптимизирует сгенерированный код, задавая выход блока, который генерирует векторы в скаляры для блоков, таких как Mux, Sum, Gain и Bus. Эта оптимизация уменьшает память стека путем замены временных локальных массивов локальными переменными.
В модели, rtwdemo_VectorOptimization, выход блоков Gain G1
и G2
являются ли векторные сигналы tmp1
и tmp2
. Эти векторы имеют ширину 10.
model = 'rtwdemo_VectorOptimization'; open_system(model); set_param(model, 'SimulationCommand', 'update')
Создайте временную папку (в системной временной папке) для процесса сборки и проверки.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
slbuild(model)
### Starting build procedure for: rtwdemo_VectorOptimization ### Successful completion of build procedure for: rtwdemo_VectorOptimization Build Summary Top model targets built: Model Action Rebuild Reason =========================================================================================================== rtwdemo_VectorOptimization 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 16.523s
Оптимизированный код в rtwdemo_VectorOptimization.c
. Сигналы tmp1
и tmp2
являются локальными переменными rtb_tmp1
и rtb_tmp2
.
cfile = fullfile(cgDir,'rtwdemo_VectorOptimization_grt_rtw',... 'rtwdemo_VectorOptimization.c'); rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_VectorOptimization_step(void) { real_T rtb_Sum3; real_T rtb_tmp1; real_T rtb_tmp2; int32_T i; for (i = 0; i < 10; i++) { /* Gain: '<Root>/G2' incorporates: * UnitDelay: '<Root>/X2' */ rtb_tmp2 = 0.3 * rtwdemo_VectorOptimization_DW.X2_DSTATE[i]; /* Gain: '<Root>/G1' incorporates: * UnitDelay: '<Root>/X1' */ rtb_tmp1 = 0.2 * rtwdemo_VectorOptimization_DW.X1_DSTATE[i]; /* Sum: '<Root>/Sum3' incorporates: * Gain: '<Root>/G3' * Inport: '<Root>/In2' * Sum: '<Root>/Sum1' * Sum: '<Root>/Sum2' * UnitDelay: '<Root>/X3' */ rtb_Sum3 = ((rtwdemo_VectorOptimization_U.In2[i] - 0.4 * rtwdemo_VectorOptimization_DW.X3_DSTATE[i]) - rtb_tmp2) - rtb_tmp1; /* Outport: '<Root>/Out2' */ rtwdemo_VectorOptimization_Y.Out2[i] = rtb_Sum3; /* Update for UnitDelay: '<Root>/X3' */ rtwdemo_VectorOptimization_DW.X3_DSTATE[i] = rtb_tmp2; /* Update for UnitDelay: '<Root>/X2' */ rtwdemo_VectorOptimization_DW.X2_DSTATE[i] = rtb_tmp1; /* Update for UnitDelay: '<Root>/X1' */ rtwdemo_VectorOptimization_DW.X1_DSTATE[i] = rtb_Sum3; } }
Закройте модель и отчет о генерации кода.
bdclose(model) rtwdemoclean; cd(currentDir)