Оптимизируйте сгенерированный код путем передачи допускающей повторное использование подсистемы Выходные параметры в качестве отдельных аргументов

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

Модель в качестве примера

Рассмотрите модель 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. Заметьте глобальную структуру блока 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;
}

Включите эту оптимизацию

  1. Откройте диалоговое окно Configuration Parameters.

  2. На панели Оптимизации, Передача набора допускающая повторное использование подсистема выходные параметры относительно Individual arguments.

В качестве альтернативы можно использовать API командной строки, чтобы включить оптимизацию:

set_param(model, 'PassReuseOutputArgsAs', 'Individual arguments');

Сгенерируйте код с этой оптимизацией

С этой оптимизацией, ReusableSubsystem функция имеет три выходных аргумента, которые являются прямыми ссылками к внешним выходным параметрам. 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)

Смотрите также

Похожие темы