В этом примере показано, как генератор кода удаляет временные буферы для блоков чтения и записи хранилища данных. Эта оптимизация улучшает скорость выполнения и уменьшает потребление оперативной памяти.
Модель 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)
Повторно используйте буферы для блоков чтения и записи хранилища данных