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

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

Пример модели

В rtwdemo_fixptdiv модели два сигнала с фиксированной точкой соединяются с блоком Divide. Параметр Number of inputs имеет значение /*.

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);
}

Сгенерированный код содержит высокоэффективную операцию правого сдвига вместо дорогостоящей операции деления. Сгенерированный код также содержит предварительно вычисленное значение для постоянного входа в блок Product.

Обратите внимание, что полученная операция также включает регулировку в масштабировании сигнала от 2 ^ -3 до 2 ^ -5.

Закройте модель и отчет о генерации кода.

bdclose(model)
rtwdemoclean;
cd(currentDir)

Похожие темы