Удалить корневой ввод-вывод уровня обнуляет инициализацию и Удаляет внутреннее нулевое управление параметрами инициализации данных, содержит ли сгенерированный код код инициализации для внутренних данных (состояния блока и блок выходные параметры) и внешних данных (корневой импорт и выходные порты), чье значение является нулем. Устранение нулевого кода инициализации ускоряет инициализацию модели, уменьшает потребление 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)
В этом примере показано, как удалить код инициализации из импорта корневого уровня и обнуленных выходных портов.
Модель в качестве примера
В модели 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));
}
/*
Включите оптимизацию
Откройте диалоговое окно Configuration Parameters.
На панели Оптимизации выберите корневую нулевую инициализацию ввода-вывода уровня 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 классы памяти не инициализируются, независимо от настроек Того, чтобы удалять внутреннюю нулевую инициализацию данных и Удаляют корневые нулевые параметры инициализации ввода-вывода уровня.