Удалить корневой ввод-вывод уровня обнуляет инициализацию и Удаляет внутреннее нулевое управление параметрами инициализации данных, содержит ли сгенерированный код код инициализации для внутренних данных (состояния блока и блок выходные параметры) и внешних данных (корневой импорт и выходные порты), чье значение является нулем. Устранение нулевого кода инициализации ускоряет инициализацию модели, уменьшает потребление 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('rtwbuild(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('rtwbuild(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('rtwbuild(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('rtwbuild(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
классы памяти не инициализируются, независимо от настроек Того, чтобы удалять внутреннюю нулевую инициализацию данных и Удаляют корневые нулевые параметры инициализации ввода-вывода уровня.