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

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

Пример

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

model = 'rtwdemo_deadpathElim';
open_system(model);

Сгенерируйте код с включенным блоком Assertion

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

  2. Установите флажок Enable assertion (Включить значения). Кроме того, используйте API командной строки, чтобы включить блок Assertion.

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

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

  1. Для блока Assertion откройте диалоговое окно Параметры Блоков.

  2. Снимите флажок Enable assertion.

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

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.

Похожие темы