В этом примере показано, как генератор кода оптимизирует операции фиксированной точки, заменяя дорогие операции деления на высокоэффективные операции продукта. Эта оптимизация улучшает скорость выполнения.
В модели rtwdemo_fixptdiv, два сигнала фиксированной точки соединяются с блоком Divide. Количество входного параметра имеет значение /*
.
model='rtwdemo_fixptdiv'; load_system(model) set_param(model,'HideAutomaticNames','off','SimulationCommand','Update') open_system(model);
Создайте временную папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
set_param(model,'GenCodeOnly','on'); slbuild(model);
### Starting build procedure for: rtwdemo_fixptdiv ### Successful completion of code generation for: rtwdemo_fixptdiv Build Summary Top model targets built: Model Action Rebuild Reason ==================================================================================== rtwdemo_fixptdiv Code generated Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.5439s
Просмотрите сгенерированный код. Вот фрагмент rtwdemo_fixptdiv.c
.
cfile = fullfile(cgDir,'rtwdemo_fixptdiv_ert_rtw','rtwdemo_fixptdiv.c'); rtwdemodbtype(cfile,'/* Model step','/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_fixptdiv_step(void) { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/In1' * Product: '<Root>/Divide' */ rtY.Out1 = (int16_T)(rtU.In1 >> 3); }
Сгенерированный код содержит высокоэффективную операцию сдвига вправо вместо дорогой операции деления. Сгенерированный код также содержит предварительно вычисленное значение для постоянного входа с блоком продукта.
Обратите внимание на то, что получившаяся операция также включает корректировку в сигнал, масштабирующийся от 2^-3 до 2^-5.
Закройте отчет генерации кода и модель.
bdclose(model) rtwdemoclean; cd(currentDir)