Этот пример показывает, как 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)