Оптимизируйте сгенерированный код, используя memset Функция

В этом примере показано, как оптимизировать сгенерированный код с помощью memset функция для очистки внутреннего хранилища. Когда вы выбираете параметр конфигурации модели Использовать memset для инициализации floats и удваивается до 0,0, memset функция очищает внутреннюю память до целочисленного битового шаблона 0 (то есть все биты отключены).

Если ваш компилятор и целевой CPU оба представляют нуль с плавающей точкой с целочисленным битовым шаблоном 0, рассмотрите установку этого параметра для выполнения усиления и эффективности ПЗУ.

ПРИМЕЧАНИЕ. Значения командной строки являются противоположными значениям настроек. 'on' в командной строке соответствует очистке настройки. 'off' в командной строке соответствует выбору настройки.

Эта оптимизация:

  • Уменьшает потребление ПЗУ.

  • Улучшает скорость выполнения.

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

Рассмотрим matlab:rtwdemo_memset модели.

model = 'rtwdemo_memset';
open_system(model);

Сгенерируйте код

Генератор кода использует цикл, чтобы инициализировать Constant блочные значения.

Создайте временную папку (в системной временной папке) для процесса сборки и проверки.

currentDir = pwd;
[~,cgDir] = rtwdemodir();

Создайте модель.

slbuild(model)
### Starting build procedure for: rtwdemo_memset
### Successful completion of build procedure for: rtwdemo_memset

Build Summary

Top model targets built:

Model           Action                       Rebuild Reason                                    
===============================================================================================
rtwdemo_memset  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 10.531s

Просмотрите сгенерированный код без оптимизации. Эти строки кода находятся в rtwdemo_memset.c.

cfile = fullfile(cgDir,'rtwdemo_memset_grt_rtw','rtwdemo_memset.c');
rtwdemodbtype(cfile,'/* Model initialize function */',...
    '/* Model terminate function */',1,0);
/* Model initialize function */
void rtwdemo_memset_initialize(void)
{
  /* Registration code */

  /* initialize error status */
  rtmSetErrorStatus(rtwdemo_memset_M, (NULL));

  /* external outputs */
  {
    int32_T i;
    for (i = 0; i < 50; i++) {
      rtwdemo_memset_Y.Out1[i] = 0.0;
    }
  }

  {
    int32_T i;

    /* ConstCode for Outport: '<Root>/Out1' */
    for (i = 0; i < 50; i++) {
      rtwdemo_memset_Y.Out1[i] = 56.0;
    }

    /* End of ConstCode for Outport: '<Root>/Out1' */
  }
}

Включите оптимизацию

  1. Откройте диалоговое окно Параметры конфигурации.

  2. В диалоговом окне Параметра конфигурации выберите Use memset, чтобы инициализировать floats и удвоится до 0,0 параметра. Также можно использовать API командной строки, чтобы включить оптимизацию:

set_param(model,'InitFltsAndDblsToZero','off');

% # Open the Configuration Parameters dialog box.

Сгенерируйте код с оптимизацией

Генератор кода использует memset функция для инициализации Constant блочные значения.

Создайте модель.

slbuild(model)
### Starting build procedure for: rtwdemo_memset
### Successful completion of build procedure for: rtwdemo_memset

Build Summary

Top model targets built:

Model           Action                       Rebuild Reason                   
==============================================================================
rtwdemo_memset  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 5.655s

Просмотрите сгенерированный код с оптимизацией. Эти строки кода находятся в rtwdemo_memset.c.

rtwdemodbtype(cfile,'/* Model initialize function */',...
    '/* Model terminate function */',1,0);
/* Model initialize function */
void rtwdemo_memset_initialize(void)
{
  /* Registration code */

  /* initialize error status */
  rtmSetErrorStatus(rtwdemo_memset_M, (NULL));

  /* external outputs */
  (void) memset(&rtwdemo_memset_Y.Out1[0], 0,
                50U*sizeof(real_T));

  {
    int32_T i;

    /* ConstCode for Outport: '<Root>/Out1' */
    for (i = 0; i < 50; i++) {
      rtwdemo_memset_Y.Out1[i] = 56.0;
    }

    /* End of ConstCode for Outport: '<Root>/Out1' */
  }
}

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

bdclose(model)
rtwdemoclean;
cd(currentDir)

См. также

Похожие темы