В этом примере показано, как генератор кода демонтирует временные буферы для блоков Записи Чтения и Хранилища данных Хранилища данных. Эта оптимизация улучшает скорость выполнения и уменьшает потребление 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(); 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; }
Сгенерированный код содержит копии данных для блоков Записи Чтения и Хранилища данных Хранилища данных, соответственно.
В диалоговом окне Configuration Parameters очистите буферы Повторного использования для параметра блоков Записи Чтения и Хранилища данных Хранилища данных или в командной строке 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 внутренне пишет в Блок памяти Хранилища данных.
Запись Чтения или Хранилища данных Хранилища данных блокирует избранные элементы массива от Блока памяти Хранилища данных.
Блок памяти Хранилища данных имеет пользовательский класс памяти.
Блоки Записи Чтения и Хранилища данных Хранилища данных происходят на том же блоке, если тот блок не является блоком Bus Assignment или блоком Assignment.
Закройте модель и вымойтесь.
bdclose(model) rtwdemoclean; cd(currentDir)
Повторное использование буферизует для блоков Записи Чтения и Хранилища данных Хранилища данных