exponenta event banner

Устранение путей мертвого кода в сгенерированном коде

В этом примере показано, как генератор кода устраняет устаревшие (то есть неиспользуемые) пути кода из сгенерированного кода. Эта оптимизация увеличивает скорость выполнения и сохраняет потребление ПЗУ и ОЗУ.

Пример

В rtwdemo_deadpathElim модели сигнал, выходящий из блока Суммы, делится на два отдельных кодовых пути. Верхний путь не является мертвым путем кода. Если пользователь отключает блок Assertion, нижний путь становится тупиковым путем кода.

model = 'rtwdemo_deadpathElim';
open_system(model);

Создание кода с включенным блоком утверждения

  1. Для блока утверждения откройте диалоговое окно параметров блока.

  2. Установите флажок Включить утверждение. Для включения блока Assertion можно также использовать API командной строки.

set_param([model '/Assert1'], 'Enabled', 'on');

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

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

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

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

Build Summary

Top model targets built:

Model                 Action                       Rebuild Reason                                    
=====================================================================================================
rtwdemo_deadpathElim  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 7.6s

Поскольку блок Assertion включен, эти строки rtwdemo_deadpathElim.c включить код для блоков Gain и Assertion.

cfile = fullfile(cgDir,'rtwdemo_deadpathElim_grt_rtw','rtwdemo_deadpathElim.c');
rtwdemodbtype(cfile,'/* Model step', '/* Model initialize function */', 0, 1);
void rtwdemo_deadpathElim_step(void)
{
  /* Sum: '<Root>/Sum1' incorporates:
   *  Constant: '<Root>/Constant1'
   *  Inport: '<Root>/In1'
   */
  rtwdemo_deadpathElim_Y.Out1 = rtwdemo_deadpathElim_U.In1 + 1.0;

  /* Assertion: '<Root>/Assert1' incorporates:
   *  Gain: '<Root>/G1'
   */
  utAssert(2.0 * rtwdemo_deadpathElim_Y.Out1 != 0.0);
}

Создание кода с отключенным блоком утверждения

Отключите блок Assertion, чтобы создать путь мертвого кода. Генератор кода обнаруживает мертвый путь кода и исключает его из сгенерированного кода.

  1. Для блока «Утверждение» откройте диалоговое окно «Параметры блока».

  2. Снимите флажок Включить утверждение.

Также можно отключить блок Assertion с помощью API командной строки.

set_param([model '/Assert1'], 'Enabled', 'off');

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

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

Build Summary

Top model targets built:

Model                 Action                       Rebuild Reason                   
====================================================================================
rtwdemo_deadpathElim  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.1542s

Поскольку блок Assertion отключен, эти строки rtwdemo_deadpathElim.c не включают код для блоков Gain и Assertion.

rtwdemodbtype(cfile,'/* Model step', '/* Model initialize function */', 0, 1);
void rtwdemo_deadpathElim_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Constant: '<Root>/Constant1'
   *  Inport: '<Root>/In1'
   *  Sum: '<Root>/Sum1'
   */
  rtwdemo_deadpathElim_Y.Out1 = rtwdemo_deadpathElim_U.In1 + 1.0;
}

Закройте модель и выполните очистку.

bdclose(model)
rtwdemoclean;
cd(currentDir)

Другой пример того, как генератор кода устраняет мертвые пути кода в сгенерированном коде, см. в разделе rtwdemo_deadpath.

Связанные темы