exponenta event banner

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

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

Пример модели

Рассмотрим модель 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. Обратите внимание на структуру глобального блока ввода-вывода и на шаге модели скопируйте данные из этой структуры.

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. Откройте диалоговое окно «Параметры конфигурации».

  2. На панели Оптимизация (Optimization) установите выходные данные повторно используемой подсистемы Pass как 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)

См. также

Связанные темы