Удалите код инициализации

Удалить корневой ввод-вывод уровня обнуляет инициализацию (Simulink Coder) и Удаляет внутреннюю нулевую инициализацию данных (Simulink Coder) управление параметрами, содержит ли сгенерированный код код инициализации для внутренних данных (состояния блока и блок выходные параметры) и внешних данных (корневой импорт и выходные порты), чье значение является нулем. Если ваше встраиваемое приложение инициализирует RAM, чтобы обнулить при запуске, вам не может быть нужен код инициализации. Устранение этого кода ускоряет образцовую инициализацию, уменьшает потребление ROM и увеличивает скорость выполнения сгенерированного кода.

Удалите нулевой код инициализации для внутренних данных

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

Модель в качестве примера

Откройте модель rtwdemo_internal_init. Модель содержит активированную подсистему, начальный вывод которой является нулем. Подсистема содержит блок Unit Delay, начальным условием которого является 0.

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

Создайте модель с помощью Embedded Coder.

### Starting build procedure for model: rtwdemo_internal_init
### Successful completion of build procedure for model: rtwdemo_internal_init

Этот код находится в файле rtwdemo_internal_init.c.

/* Model initialize function */
void rtwdemo_internal_init_initialize(void)
{
  /* Registration code */

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

  /* states (dwork) */
  (void) memset((void *)&rtDWork, 0,
                sizeof(D_Work));

  /* SystemInitialize for Enabled SubSystem: '<Root>/Enabled Subsystem' */
  /* InitializeConditions for UnitDelay: '<S1>/Unit Delay' */
  rtDWork.UnitDelay_DSTATE = 0.0;

  /* End of SystemInitialize for SubSystem: '<Root>/Enabled Subsystem' */
}

/*

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

Откройте диалоговое окно Configuration Parameters. На панели Оптимизации выберите Remove внутренняя нулевая инициализация данных.

Также можно использовать командную строку, чтобы включить оптимизацию. Чтобы включить оптимизацию, установите параметр модели ZeroInternalMemoryAtStartup на 'off'.

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

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

Создайте модель с помощью Embedded Coder.

### Starting build procedure for model: rtwdemo_internal_init
### Successful completion of build procedure for model: rtwdemo_internal_init

Этот код находится в файле rtwdemo_internal_init.c. Сгенерированный код не инициализирует внутренние данные присвоением на нуль.

/* Model initialize function */
void rtwdemo_internal_init_initialize(void)
{
  /* (no initialization code required) */
}

/*

Если вы выбираете Remove внутренний нулевой параметр инициализации данных, имеют в виду, что память не может быть в известном состоянии каждым разом, когда сгенерированный код выполняется. Это означает, что выполнение модели (или сгенерированная S-функция) многократно может привести к различным ответам для каждого выполнения. Это поведение иногда желательно. Например, можно выбрать Remove внутренний нулевой параметр инициализации данных, если вы хотите протестировать поведение своего проекта во время горячей загрузки (то есть, перезапуск без полной системной реинициализации). Для моделей, в которых вы выбираете Remove внутренний нулевой параметр инициализации данных, но все еще хотите получить тот же ответ на каждом выполнении от S-функции, можно использовать любую из следующих команд перед каждым выполнением:

clear SFcnName

где SFcnName является именем S-функции, или

clear mex

Удалите код инициализации для Корневого Уровня Inports и обнуленные выходные порты

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

Примечание: Этот пример требует лицензии Embedded Coder®.

Модель в качестве примера

В модели rtwdemo_rootlevel_zero_initialization, все сигналы ввода и вывода имеют числовое значение нуля. Поскольку сигналы, sig1 и sig2 имеют типы данных int16 и Boolean, соответственно, и все выходные сигналы, имеют тип данных double, эти сигналы также имеют начальные значения поразрядного нуля. Сигналы имеют целочисленную комбинацию двоичных разрядов 0, означая, что все биты выключены. sig1_b сигналов и sig2_b имеют тип данных с фиксированной точкой со смещением, таким образом, их начальное значение не является поразрядным нулем.

model = 'rtwdemo_rootlevel_zero_initialization';
open_system(model);

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

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

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

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

set_param(model, 'ZeroExternalMemoryAtStartup','on');
rtwbuild(model)
### Starting build procedure for model: rtwdemo_rootlevel_zero_initialization
### Successful completion of build procedure for model: rtwdemo_rootlevel_zero_initialization

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

cfile = fullfile(cgDir,'rtwdemo_rootlevel_zero_initialization_ert_rtw',...
    'rtwdemo_rootlevel_zero_initialization.c');
rtwdemodbtype(cfile, 'rtwdemo_rootlevel_zero_initialization_initialize',...
    'trailer for generated code', 1, 0);
void rtwdemo_rootlevel_zero_initialization_initialize(void)
{
  /* Registration code */

  /* external inputs */
  sig1 = 0;
  sig1_b = -3;
  sig2 = false;
  sig2_b = -3;

  /* external outputs */
  (void) memset((void *)&rtY, 0,
                sizeof(ExternalOutputs));
}

/*

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

  1. Откройте диалоговое окно Configuration Parameters.

  2. На панели Оптимизации выберите корневую нулевую инициализацию ввода-вывода уровня Remove.

Также используйте API командной строки, чтобы включить оптимизацию:

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

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

Оптимизированный код не содержит код инициализации для входных сигналов sig1, sig2 и эти четыре выходных сигнала, потому что их начальные значения являются поразрядным нулем.

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

rtwbuild(model)
### Starting build procedure for model: rtwdemo_rootlevel_zero_initialization
### Successful completion of build procedure for model: rtwdemo_rootlevel_zero_initialization

Вот оптимизированный код rtwdemo_rootlevel_zero_initialization.c в функции инициализации.

cfile = fullfile(cgDir,'rtwdemo_rootlevel_zero_initialization_ert_rtw',...
    'rtwdemo_rootlevel_zero_initialization.c');
rtwdemodbtype(cfile, 'rtwdemo_rootlevel_zero_initialization_initialize',...
    'trailer for generated code', 1, 0);
void rtwdemo_rootlevel_zero_initialization_initialize(void)
{
  /* Registration code */

  /* external inputs */
  sig1_b = -3;
  sig2_b = -3;
}

/*

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

bdclose(model)
rtwdemoclean;
cd(currentDir)

Дополнительная информация

  • Вы можете использовать Использование memset, чтобы инициализировать плавания и удваиваете параметр, чтобы управлять представлением нуля во время инициализации. Смотрите Использование memset, чтобы инициализировать плавания, и удваивается до 0,0 (Simulink Coder).

  • Код все еще инициализирует структуры данных, значение которых не является нулем, когда вы выбираете Remove внутренняя нулевая инициализация данных и Удаляете корневую нулевую инициализацию ввода-вывода уровня.

  • Данные ImportedExtern или классов памяти ImportedExternPointer не инициализируются, независимо от настроек Того, чтобы удалять внутреннюю нулевую инициализацию данных и Удаляют корневые нулевые параметры инициализации ввода-вывода уровня.

Похожие темы