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

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

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

В модели 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');
rtwbuild(model);
### Starting build procedure for model: rtwdemo_fixptdiv
### Successful completion of code generation for model: rtwdemo_fixptdiv

Просмотрите сгенерированный код. Вот фрагмент 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)

Похожие темы