Оптимизируйте сгенерированный код для операций данных фиксированной точки

В этом примере показано, как генератор кода оптимизирует операции фиксированной точки, заменяя дорогие операции деления на высокоэффективные операции продукта. Эта оптимизация улучшает скорость выполнения.

Модель в качестве примера

В модели 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)

Похожие темы