exponenta event banner

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

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

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

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

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

Если для параметра упаковки интерфейса кода установлено значение Reusable function и установите параметр Use dynamic memory allocation for model initialization, флажки Remove root level I/O zero initialization и Remove internal data zero initialization сняты и в командной строке, ZeroExternalMemoryAtStartup и ZeroInternalMemoryAtStartup для параметров установлено значение 'on'.

Для модели, в которой для параметра упаковки интерфейса кода установлено значение C++ class и параметр Использовать динамическое выделение памяти для создания экземпляра блока модели установлен, флажок Удалить инициализацию внутреннего нуля данных снят и ZeroInternalMemoryAtStartup имеет значение «on» и доступен только для чтения.

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

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

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

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

model = 'rtwdemo_internal_init';
open_system(model);

Создание кода без оптимизации

Создайте модель с помощью встроенного кодера.

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' */
}

/*

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

Откройте диалоговое окно «Параметры конфигурации». На панели Оптимизация (Optimization) выберите Удалить инициализацию внутреннего нуля данных (Remove internal data zero initialization).

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

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

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

Создайте модель с помощью встроенного кодера.

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)

Удаление кода инициализации из корневых входов и выходов, имеющих нулевое значение

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

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

В 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');
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. На панели Оптимизация (Optimization) выберите Удалить инициализацию нуля ввода-вывода на корневом уровне (Remove root level I/O zero initialization).

Либо используйте 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 можно использовать для инициализации параметров floats и doubles для управления представлением нуля во время инициализации. См. раздел Использование memset для инициализации поплавков и двойников до 0.0.

  • Код по-прежнему инициализирует структуры данных, значение которых не равно нулю, при выборе параметров инициализации Remove internal data zero и Remove root level I/O zero.

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

Связанные темы