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