В этом примере показано, как генератор кода удаляет временные буферы для блоков чтения и записи хранилища данных. Эта оптимизация улучшает скорость выполнения и уменьшает потребление оперативной памяти.
Модель rtwdemo_optimizedatastorebuffers
содержит вызывающую сторону Function UpdateFunc
, который вызывает функцию Simulink DefineUpdateFunc
. Блок «Чтение хранилища данных» DSR
читает из mem
. Блок записи хранилища данных DSW
записывает в mem
.
model='rtwdemo_optimizedatastorebuffers';
open_system(model);
В Параметры конфигурации окне снимите флажок «Повторно использовать буферы» для параметра Данных Store Read and Данных Store Write блоков или в командной строке MATLAB введите эту команду:
set_param(model,'OptimizeDataStoreBuffers','off');
Создайте модель.
currentDir = pwd; [~,cgDir] = rtwdemodir(); slbuild(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 15.362s
Просмотрите сгенерированный код без оптимизации. Этот код находится в 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; }
Сгенерированный код содержит копии данных для блоков Data Store Read и Data Store Write, соответственно.
В Параметры конфигурации окне очистите буферы Reuse для параметра Данных Store Read and Данных Store Write блоков или в командной строке MATLAB введите эту команду:
set_param(model,'OptimizeDataStoreBuffers','on');
Создайте модель.
slbuild(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 10.073s
Просмотрите сгенерированный код с оптимизацией. Этот код находится в 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 внутренне записывает в блок Data Store Memory.
Блоки Data Store Read или Data Store Write выбирают элементы массива из блока Data Store Memory.
Блок памяти хранилища данных имеет пользовательский класс памяти.
Блоки Чтения и Записи Хранилища Данных происходят на одном блоке, если этот блок не является блоком Назначения Шины или блоком Назначения.
Закройте модель и очистите.
bdclose(model) rtwdemoclean; cd(currentDir)
Повторно используйте буферы для блоков чтения и записи хранилища данных