В этом примере показано, как генератор кода удаляет временные буферы для блоков чтения хранилища данных и записи хранилища данных. Эта оптимизация повышает скорость выполнения и снижает потребление ОЗУ.
Модель rtwdemo_optimizedatastorebuffers содержит вызывающую функцию UpdateFunc, которая вызывает функцию Simulink DefineUpdateFunc. Блок чтения хранилища данных DSR читает из mem. Блок записи хранилища данных DSW записывает в mem.
model='rtwdemo_optimizedatastorebuffers';
open_system(model);

В диалоговом окне «Параметры конфигурации» отмените выбор параметра «Повторно использовать буферы для блоков чтения и записи хранилища данных» или в командной строке 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;
}
Созданный код содержит копии данных для блоков «Чтение хранилища данных» и «Запись хранилища данных» соответственно.
В диалоговом окне «Параметры конфигурации» снимите флажок «Повторно использовать буферы для блоков чтения и записи хранилища данных» или в командной строке 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;
}
Копия данных для блока записи хранилища данных отсутствует в сгенерированном коде. Код содержит копию данных для блока чтения хранилища данных, поскольку блок Sum выполняется после блока записи хранилища данных. Созданный код содержит переменную rtb_DSR_last для сохранения выходных данных блока Sum. Поэтому блок Sum получает значения, которые SimFuncCall вычисляется в начале временного шага, а не в следующем временном шаге. Если приоритет блока Sum ниже, чем SimFuncCallгенератор кода может удалить копию данных для блока чтения хранилища данных. Некоторые другие случаи, в которых генератор кода не может исключить копии данных:
Функция Simulink осуществляет внутреннюю запись в блок памяти хранилища данных.
Блоки чтения хранилища данных или записи хранилища данных выбирают элементы массива из блока памяти хранилища данных.
Блок памяти хранилища данных имеет пользовательский класс хранения.
Блоки чтения хранилища данных и записи хранилища данных находятся в одном блоке, если этот блок не является блоком назначения шины или блоком назначения.
Закройте модель и выполните очистку.
bdclose(model) rtwdemoclean; cd(currentDir)
Повторное использование буферов для блоков чтения и записи хранилища данных