Этот пример показывает, как генератор кода демонтирует временные буферы для блоков Записи Чтения и Хранилища данных Хранилища данных. Эта оптимизация улучшает скорость выполнения и уменьшает потребление 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 model: rtwdemo_optimizedatastorebuffers ### Successful completion of build procedure for model: rtwdemo_optimizedatastorebuffers
Просмотрите сгенерированный код без оптимизации. Этот код находится в 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 rtwdemo_optimizedatastorebuffers_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: * 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 model: rtwdemo_optimizedatastorebuffers ### Successful completion of build procedure for model: rtwdemo_optimizedatastorebuffers
Просмотрите сгенерированный код с оптимизацией. Этот код находится в 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 rtwdemo_optimizedatastorebuffers_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: * 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)
Повторное использование буферизует для блоков Записи Чтения и Хранилища данных Хранилища данных