Удаление кода инициализации нуля

Удалите корневой уровень ввода-вывода нулевой инициализации и Удалите внутренние данные параметры нулевой инициализации, управляют, содержит ли сгенерированный код инициализации для внутренних данных (состояния блока и блочные выходные параметры) и внешних данных (корневые входные и выходные порты), значение которых равняется нулю. Исключение кода инициализации нуля ускоряет инициализацию модели, уменьшает потребление ПЗУ и увеличивает скорость выполнения сгенерированного кода.

Во время запуска совместимые со стандартом компиляторы C и C++ инициализируют глобальные данные до нуля, устраняя необходимость включать нулевой код инициализации для этих данных в сгенерированный код. Совместимые со стандартами компиляторы не обязательно инициализируют динамически выделенные данные и локальные переменные в нуле. Прежде чем оставить выбранные Remove root level I/O zero initialization и Remove internal data zero initialization параметры, подтвердите следующее:

  • Если ваш компилятор не соответствует стандартам, подтвердите, что он инициализирует глобальные данные в нуле.

  • Если для упаковки интерфейса Code задано значение Reusable function или C++ class, подтвердите, что данные выделены статически или что динамически выделенные данные инициализированы в нуль.

Если вы устанавливаете параметр Code interface packaging равным Reusable function и установите параметр Использовать динамическое выделение памяти для инициализации модели, флажки Remove root level I/O zero initialization и Remove internal data zero initialization снимаются и в командной строке, ZeroExternalMemoryAtStartup и ZeroInternalMemoryAtStartup параметры установлены в 'on'.

Для модели, в которой параметр Code interface packaging установлен в C++ class и установлен параметр Использовать динамическое выделение памяти для экземпляра блока модели, флажок Remove internal data zero initialization снят и ZeroInternalMemoryAtStartup установлено на ' on ' и доступно только для чтения.

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

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

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

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

model = 'rtwdemo_internal_init';
open_system(model);

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

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

currentDir = pwd;
[~,cgDir] = rtwdemodir();
evalc('slbuild(model)');

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

cfile = fullfile(cgDir,'rtwdemo_internal_init_ert_rtw','rtwdemo_internal_init.c');
rtwdemodbtype(cfile,'/* Model initialize', '* File trailer', 1, 0);
/* 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' */
}

/*

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

Откройте диалоговое окно Параметры конфигурации. На панели Оптимизации выберите Удалить внутренние данные нулевой инициализации.

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

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

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

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

evalc('slbuild(model)');

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

rtwdemodbtype(cfile,'/* Model initialize', '* File trailer', 1, 0);
/* Model initialize function */
void rtwdemo_internal_init_initialize(void)
{
  /* (no initialization code required) */
}

/*
bdclose(model)
rtwdemoclean;
cd(currentDir)

Удалите код инициализации из Inports и Outports корневого уровня, установленный на нуль

В этом примере показано, как удалить код инициализации из входных портов корневого уровня и выходных портов, установленных на нуль.

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

В 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();

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

set_param(model, 'ZeroExternalMemoryAtStartup','on');
evalc('slbuild(model)');

Эти линии 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. Откройте диалоговое окно Параметры конфигурации.

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

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

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

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

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

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

evalc('slbuild(model)');

Вот 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)

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

  • Можно использовать параметр Use memset для инициализации плавающих и двойных чисел, чтобы управлять представлением нуля во время инициализации. Смотрите Использовать memset, чтобы инициализировать плавающие и двойные значения до 0.0.

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

  • Данные ImportedExtern или ImportedExternPointer классы хранения не инициализируются, независимо от настроек параметров Remove internal data null initialization и Remove root level initialization.

Похожие темы