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

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

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

Рассмотрите модель rtwdemo_reusable_sys_outputs. В этой модели допускающая повторное использование подсистема выводит, питают корневые выходные параметры модели.

model = 'rtwdemo_reusable_sys_outputs';
open_system(model);

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

Сгенерируйте код для этой модели в то время как передающая подсистема выходные параметры как ссылка структуры. Создайте временную папку для сборки и инспекционного процесса.

currentDir = pwd;
[~,cgDir] = rtwdemodir();

Создайте модель.

rtwbuild(model)
### Starting build procedure for model: rtwdemo_reusable_sys_outputs
### Successful completion of build procedure for model: rtwdemo_reusable_sys_outputs

Фрагмент кода показывает фрагменты 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 (внешние выходные параметры), структура не находится в сгенерированном коде.

Создайте модель.

rtwbuild(model)
### Starting build procedure for model: rtwdemo_reusable_sys_outputs
### Successful completion of build procedure for model: rtwdemo_reusable_sys_outputs

Фрагмент кода ниже является фрагментом 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)

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

Похожие темы