Сокращение копии данных для блоков записи чтения и хранилища данных хранилища данных

В этом примере показано, как генератор кода демонтирует временные буферы для блоков Записи Чтения и Хранилища данных Хранилища данных. Эта оптимизация улучшает скорость выполнения и уменьшает потребление RAM.

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

Модель rtwdemo_optimizedatastorebuffers содержит Функциональную вызывающую сторону UpdateFunc, который вызывает Функцию Simulink DefineUpdateFunc. Блок Data Store Read DSR чтения от mem. Блок Data Store Write DSW записи к mem.

model='rtwdemo_optimizedatastorebuffers';
open_system(model);

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

В диалоговом окне Configuration Parameters отмените выбор буферов Повторного использования для параметра блоков Записи Чтения и Хранилища данных Хранилища данных или в командной строке MATLAB, введите эту команду:

set_param(model,'OptimizeDataStoreBuffers','off');

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

currentDir = pwd;
[~,cgDir] = rtwdemodir();
rtwbuild(model)
### Starting build procedure for: rtwdemo_optimizedatastorebuffers
### Successful completion of build procedure for: rtwdemo_optimizedatastorebuffers

Build Summary

Top model targets built:

Model                             Action                       Rebuild Reason                                    
=================================================================================================================
rtwdemo_optimizedatastorebuffers  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 10.4s

Просмотрите сгенерированный код без оптимизации. Этот код находится в rtwdemo_optimizedatastorebuffers.c.

cfile = fullfile(cgDir,'rtwdemo_optimizedatastorebuffers_ert_rtw',...
    'rtwdemo_optimizedatastorebuffers.c');
rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void step(void)
{
  real_T rtb_DSR_last;
  real_T rtb_SimFuncCall_o1;
  real_T rtb_Sum_p;

  /* DataStoreRead: '<Root>/DSR' */
  rtb_DSR_last = mem.last;

  /* Switch: '<Root>/Switch' incorporates:
   *  Constant: '<Root>/Constant'
   *  DataStoreRead: '<Root>/DSR'
   *  Inport: '<Root>/Clear'
   */
  if (rtU.Clear) {
    rtb_SimFuncCall_o1 = 0.0;
  } else {
    rtb_SimFuncCall_o1 = mem.max;
  }

  /* End of Switch: '<Root>/Switch' */

  /* FunctionCaller: '<Root>/SimFuncCall' incorporates:
   *  Inport: '<Root>/DataNew'
   */
  UpdateFunc(rtb_SimFuncCall_o1, rtU.DataNew, &rtb_SimFuncCall_o1, &rtb_Sum_p);

  /* DataStoreWrite: '<Root>/DSW' */
  mem.last = rtb_SimFuncCall_o1;
  mem.max = rtb_Sum_p;

  /* Outport: '<Root>/Delta' incorporates:
   *  DataStoreRead: '<Root>/DSR'
   *  Inport: '<Root>/DataNew'
   *  Sum: '<Root>/Sum'
   */
  rtY.Delta = rtU.DataNew - rtb_DSR_last;
}

Сгенерированный код содержит копии данных для блоков Записи Чтения и Хранилища данных Хранилища данных, соответственно.

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

В диалоговом окне Configuration Parameters очистите буферы Повторного использования для параметра блоков Записи Чтения и Хранилища данных Хранилища данных или в командной строке MATLAB, введите эту команду:

set_param(model,'OptimizeDataStoreBuffers','on');

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

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

Build Summary

Top model targets built:

Model                             Action                       Rebuild Reason                   
================================================================================================
rtwdemo_optimizedatastorebuffers  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 9.468s

Просмотрите сгенерированный код с оптимизацией. Этот код находится в rtwdemo_optimizedatastorebuffers.c.

cfile = fullfile(cgDir,'rtwdemo_optimizedatastorebuffers_ert_rtw',...
    'rtwdemo_optimizedatastorebuffers.c');
rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void step(void)
{
  real_T rtb_DSR_last;
  real_T tmp;

  /* DataStoreRead: '<Root>/DSR' */
  rtb_DSR_last = mem.last;

  /* Switch: '<Root>/Switch' incorporates:
   *  Constant: '<Root>/Constant'
   *  DataStoreRead: '<Root>/DSR'
   *  Inport: '<Root>/Clear'
   */
  if (rtU.Clear) {
    tmp = 0.0;
  } else {
    tmp = mem.max;
  }

  /* End of Switch: '<Root>/Switch' */

  /* FunctionCaller: '<Root>/SimFuncCall' incorporates:
   *  DataStoreWrite: '<Root>/DSW'
   *  Inport: '<Root>/DataNew'
   */
  UpdateFunc(tmp, rtU.DataNew, &mem.last, &mem.max);

  /* Outport: '<Root>/Delta' incorporates:
   *  DataStoreRead: '<Root>/DSR'
   *  Inport: '<Root>/DataNew'
   *  Sum: '<Root>/Sum'
   */
  rtY.Delta = rtU.DataNew - rtb_DSR_last;
}

Копия данных для блока Data Store Write не находится в сгенерированном коде. Код содержит копию данных для блока Data Store Read, потому что блок Sum выполняется после блока Data Store Write. Сгенерированный код содержит переменную rtb_DSR_last содержать выход блока Sum. Поэтому блок Sum получает значения что SimFuncCall вычисляет в начале временного шага, а не тех значений на следующем временном шаге. Если приоритет блока Sum ниже, чем SimFuncCall, генератор кода может удалить копию данных для блока Data Store Read. Некоторые другие случаи, в которых генератор кода не может устранить копии данных:

  • Функция Simulink внутренне пишет в Блок памяти Хранилища данных.

  • Запись Чтения или Хранилища данных Хранилища данных блокирует избранные элементы массива от Блока памяти Хранилища данных.

  • Блок памяти Хранилища данных имеет пользовательский класс памяти.

  • Блоки Записи Чтения и Хранилища данных Хранилища данных происходят на том же блоке, если тот блок не является блоком Bus Assignment или блоком Assignment.

Закройте модель и вымойтесь.

bdclose(model)
rtwdemoclean;
cd(currentDir)

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

Похожие темы