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

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

Пример

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

model = 'rtwdemo_deadpathElim';
open_system(model);

Сгенерируйте код с Enabled блоком утверждения

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

  2. Выберите вводящий блок Enable. В качестве альтернативы используйте API командной строки, чтобы включить блок Assertion.

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

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

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

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

rtwbuild(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 6.0566s

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

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. Для блока Assertion откройте диалоговое окно Block Parameters.

  2. Отмените выбор Разрешать вводящего блока.

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

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

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

rtwbuild(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.5345s

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

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.

Похожие темы