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

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

Во время запуска совместимый стандартами 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' */
}

/*

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

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

В качестве альтернативы можно использовать командную строку, чтобы включить оптимизацию. Установите параметр модели 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 и обнуленные выходные порты

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

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

В модели 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. Откройте диалоговое окно Configuration Parameters.

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

В качестве альтернативы используйте 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)

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

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

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

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

Похожие темы