Вектор операции

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

Похожие темы