Сигнальные линии, параметры блоков и состояния блока в модели могут появиться в сгенерированном коде как данные, например, как глобальные переменные. По умолчанию код инициализирует эти данные перед осуществлением первичного алгоритма. Чтобы совпадать с численными данными симуляции в Simulink®, генератор кода выбирает начальные значения на основе спецификаций, которые вы делаете в модели.
Путем понимания, как сгенерированный код инициализирует данные, вы можете:
Смоделируйте систему, которая повторно инициализирует состояния во время выполнения, что означает, что приложение может перезапустить целую систему.
Сохраните начальные значения в памяти как переменные, которые могут сохраниться между выполнениями выполнения. Можно затем перезаписать эти значения прежде, чем запустить или перезапустить систему.
Сгенерируйте эффективный код путем устранения устройства хранения данных для инвариантных начальных значений и путем предотвращения генерации кода, который излишне или избыточно инициализирует данные.
Для основной информации об инициализации сигналов и состояний в модели, смотрите, Инициализируют Сигналы и Дискретные состояния (Simulink) и информация о состоянии Загрузки (Simulink).
Чтобы инициализировать элемент данных, такой как глобальная переменная, приложение может использовать статическую или динамическую инициализацию.
Статическая инициализация происходит в том же операторе, который задает (выделяет память для), переменная. Инициализация не происходит в функциональном определении.
Код может быть более эффективным, потому что ни одна из сгенерированных образцовых функций не выполняет операторы инициализации.
Динамическая инициализация происходит в функции. Для каждой образцовой или невиртуальной подсистемы генератор кода обычно создает одну или несколько функций, которые выделены инициализации.
Сгенерированный код или ваш код могут перезапустить систему путем вызывания функции инициализации во время выполнения.
Каждый элемент данных имеет реальный ground value. Это значение может зависеть от типа данных элемента. Например, для сигнала, типом данных которого является double
или int8
, реальное наземное значение является нулем. Для перечисления наземное значение является участником перечисления по умолчанию.
Для некоторых видов данных, чтобы представлять реальное наземное значение, компьютерные магазины обнуляют в памяти (весь нуль битов). Однако для некоторых других данных, компьютерные магазины ненулевое значение в памяти. Эти данные включают, например:
Данные фиксированной точки со смещением. Код инициализирует такой элемент данных к сохраненному целочисленному значению, которое, учитывая масштабирование и смещение, представляет реальный нуль.
Перечисление, чей участник по умолчанию сопоставляет с целочисленным значением кроме нуля. Например, если участником по умолчанию является High
с базовым целочисленным значением 3, код инициализирует такой элемент данных к High
.
В модели вы можете управляющий сигнал и утверждать начальные значения через параметры блоков. Например, чтобы установить начальное значение блока Unit Delay, вы используете параметр Initial condition. В некоторых случаях можно также использовать свойство InitialValue
объекта Simulink.Signal
. Для большинства этих параметров блоков значением по умолчанию является 0
.
Можно также инициализировать состояния при помощи блоков Средства записи состояния в, Инициализируют Функциональные подсистемы и параметр конфигурации модели Initial states.
По умолчанию сгенерированный код динамически инициализирует данные состояния и сигнала (и другие данные, такие как ошибочное состояние модели) в сгенерированной функции инициализации. Функция, названная
по умолчанию, выполняет операции инициализации состояния и сигнала в этом порядке:model_initialize
Инициализирует данные состояния и сигнала в сгенерированных структурах значения по умолчанию, таких как структура DWork, к хранимой сумме нуля.
Инициализирует дополнительные данные состояния и сигнала, которые не находятся в сгенерированных структурах значения по умолчанию к соответствующему реальному наземному значению.
Эта инициализация применяется только к данным, которые соответствуют обоим из этих критериев:
Сгенерированный код задает (выделяет память для), данные.
Данные используют класс памяти кроме Auto
(класс памяти по умолчанию) или Model default
(когда Код, Сопоставляющий Редактор, задает класс памяти Default
, настройку по умолчанию).
Например, код применяет эту операцию к элементам данных, которые используют класс памяти ExportedGlobal
.
Инициализирует каждый сигнал и состояние к реальному значению, которое модель задает, например, через параметр Initial condition блока Unit Delay.
Инициализирует каждое состояние к реальному значению, которое вы присваиваете при помощи блока State Writer. Функция выполняет эту инициализацию, только если вы используете Инициализировать Функциональную подсистему в модели.
Инициализирует каждое состояние к реальному значению, что вы задаете с параметром конфигурации Initial states.
После того, как эта функция инициализации выполняется, каждый элемент данных имеет последнее реальное значение, которое присвоила функция. Например, если вы используете блок State Writer, чтобы инициализировать состояние блока к 5
, также с помощью параметра конфигурации Initial states, чтобы инициализировать то же состояние к 10
, состояние в конечном счете использует 10
в качестве начального значения.
memset
для объемной инициализацииЧтобы инициализировать элементы данных состояния или сигнала, которые имеют непрерывное устройство хранения данных к хранимой сумме нуля, сгенерированный код может вызвать memset
в функции инициализации. Элементы данных, которые имеют непрерывное устройство хранения данных, включают структуру DWork, массивы или элементы данных, которые используют тип данных многословный.
Если ваше приложение требует его, можно препятствовать тому, чтобы сгенерированный код использовал memset
для инициализации данных с плавающей точкой к сохраненному нулю. Смотрите Использование memset, чтобы инициализировать плавания, и удваивается до 0,0.
Можно сконфигурировать способ, которым настраиваемые параметры блоков, такие как параметр Gain блока Gain, появляются в сгенерированном коде. Большинство параметров блоков, которые устанавливают начальные значения (например, Initial condition) является настраиваемым. Например, поведение параметра Значения по умолчанию параметра конфигурации может определить, появляются ли начальные значения в сгенерированном коде как встроенные константы или как настраиваемые глобальные данные. Можно также использовать объекты параметра и классы памяти, чтобы управлять представлением этих начальных значений.
Для настраиваемых начальных значений, в образцовой функции инициализации, правая сторона оператора присваивания является глобальной переменной, полем структуры или другими данными, значение которых можно изменить в памяти.
Чтобы сделать начальные значения настраиваемыми в сгенерированном коде, смотрите Управляющий сигнал и Инициализацию состояния в Сгенерированном коде.
Сгенерированный код статически инициализирует данные о параметре к значениям, которые вы задаете в Simulink.
Чтобы выразить начальное значение настраиваемого параметра (глобальная переменная) как математическое выражение, включающие системные константы или другие макросы, которые требуют Embedded Coder®, видят Инициализацию Математическим выражением (Embedded Coder).
Эти элементы модели появляются в сгенерированном коде как данные о параметре:
Настраиваемые параметры блоков, такие как параметр Gain блока Gain, когда вы устанавливаете Default parameter behavior на Tunable
. Каждый параметр появляется как поле специализированной глобальной структуры.
Некоторые настраиваемые параметры блоков, когда вы устанавливаете Default parameter behavior на Inlined
. Когда генератор кода не может встроить значение параметра как литеральный номер, параметр появляется как поле специализированной глобальной структуры const
.
Simulink.Parameter
возражает, к которому вы применяете класс памяти или пользовательский класс памяти, который имеет экспортируемый осциллограф данных. Например, встроенный класс памяти, ExportedGlobal
имеет экспортируемый осциллограф данных, но класс памяти ImportedExtern
не делает.
Можно установить значение объекта параметра (такого как Simulink.Parameter
) к математическому выражению включающие числа, переменные MATLAB® и другие объекты параметра. Смотрите Установленное Значение переменных при помощи Математического выражения (Simulink).
Если вы используете этот метод с Embedded Coder, можно сгенерировать код, который инициализирует соответствующие данные о параметре (глобальная переменная) при помощи заданного выражения. Для примера смотрите, Инициализируют Значение параметров От Системы Постоянный или Другой Макрос (Embedded Coder) (Embedded Coder). Для получения общей информации, включая ограничения, смотрите Генерацию кода Объектов параметра Со Значениями Выражения.
Этот пример показывает, как сгенерированный код инициализирует сигнал, состояние и данные о параметре.
Исследуйте модель в качестве примера
Откройте модель в качестве примера, rtwdemo_rtwintro
.
open_system('rtwdemo_rtwintro')
В модели выберите View> Model Data Editor.
В Model Data Editor осмотрите вкладку Штатов. Для состояния блока Единичной задержки Начальное значение установлено к 0
, значению по умолчанию, что означает, начальное значение состояния является нулем. Состояние называют X
.
Установите Начальное значение к ненулевому номеру, например, 5
.
set_param('rtwdemo_rtwintro/X','InitialCondition','5')
Установите представление Change выпадающий список на Code
.
В таблице данных, Классе памяти набора к ExportedGlobal
. С этой установкой состояние блока появляется в сгенерированном коде как отдельная глобальная переменная.
set_param('rtwdemo_rtwintro/X','StateStorageClass','ExportedGlobal')
В модели откройте подсистему Amplifier
, которая является инициированной подсистемой.
В Model Data Editor осмотрите вкладку Parameters и установите представление Change выпадающий список на Design
. Чтобы установить и осмотреть начальные значения сигналов и состояний, можно использовать вкладку Parameters вместо вкладки Штатов.
Model Data Editor показывает, что для блока Outport, Initial вывод (InitialOutput
) параметр устанавливается на 0
, значение по умолчанию. Этот вывод подсистемы требует начального значения, потому что подсистема выполняется условно. Оставьте начальное значение в значении по умолчанию.
В модели очистите Параметры конфигурации> Повторное использование памяти. Когда вы очищаете эту установку, сигнальные линии появляются в сгенерированном коде как поля сгенерированной структуры, цель которой состоит в том, чтобы сохранить данные сигнала. Это представление сигналов облегчает, чтобы видеть, как генератор кода инициализирует данные.
set_param('rtwdemo_rtwintro','OptimizeBlockIOStorage','off')
В модели осмотрите Параметры конфигурации параметра конфигурации> Оптимизация> поведение параметра По умолчанию. Параметр конфигурации установлен в Inlined
, что означает, что параметры блоков, включая начальные значения, появляются в сгенерированном коде как встроенные литералы или как данные const
.
Перейдите к корневому уровню модели.
В Model Data Editor нажмите кнопку дополнительной информации Show/refresh.
Около поля содержимого Фильтра кликните по Фильтру с помощью кнопки выбора.
В модели щелкните, блок Constant маркировал INC
. Model Data Editor показывает, что Постоянное значение (Value
) параметр блока установлено к INC
. INC
является переменная MATLAB в базовом рабочем пространстве.
Для INC
, установленного значение в Столбце значений к Simulink.Parameter(uint8(1))
. MATLAB преобразовывает INC
в объект Simulink.Parameter
.
Используйте столбец Класса памяти, чтобы применить класс памяти ExportedGlobal
к INC
. С этой установкой сгенерированный код задает INC
как глобальную переменную. Относительно инициализации INC
является элементом данных о параметре.
INC = Simulink.Parameter(INC);
INC.StorageClass = 'ExportedGlobal';
Сгенерируйте и осмотрите код
Сгенерируйте код из модели.
rtwbuild('rtwdemo_rtwintro');
### Starting build procedure for model: rtwdemo_rtwintro ### Successful completion of build procedure for model: rtwdemo_rtwintro
В сгенерированном файле rtwdemo_rtwintro.c
, вне определения функции, код статически инициализирует данные о параметре INC
. Значением INC
является 1
.
file = fullfile('rtwdemo_rtwintro_grt_rtw','rtwdemo_rtwintro.c'); rtwdemodbtype(file,'/* Exported block parameters */','uint8_T INC = 1U;',1,1)
/* Exported block parameters */ uint8_T INC = 1U; /* Variable: INC
В том же файле осмотрите определение функции rtwdemo_rtwintro_initialize
. Во-первых, функция использует memset
, чтобы инициализировать внутренние сигналы в модели к хранимой сумме 0
.
rtwdemodbtype(file,'/* block I/O */','sizeof(B_rtwdemo_rtwintro_T));',1,1)
/* block I/O */ (void) memset(((void *) &rtwdemo_rtwintro_B), 0, sizeof(B_rtwdemo_rtwintro_T));
Функция затем инициализирует состояние Единичной задержки, X
, к наземному значению. В этом случае наземное значение является нулем.
rtwdemodbtype(file,'/* exported global states */','X = 0U;',1,1)
/* exported global states */ X = 0U;
Функция также инициализирует другие данные, включая вводы и выводы корневого уровня (Inport и блоки Outport), чтобы основать значения.
rtwdemodbtype(file,'/* external inputs */','Amplifier_Trig_ZCE = POS_ZCSIG;',1,1)
/* external inputs */ rtwdemo_rtwintro_U.Input = 0; /* external outputs */ rtwdemo_rtwintro_Y.Output = 0; rtwdemo_rtwintro_PrevZCX.Amplifier_Trig_ZCE = POS_ZCSIG;
Функция затем инициализирует X
к значению, которое вы задали в Начальных параметрах блоков условия.
rtwdemodbtype(file,'/* InitializeConditions for UnitDelay: ''<Root>/X'' */',... 'X = 5U;',1,1)
/* InitializeConditions for UnitDelay: '<Root>/X' */ X = 5U;
Наконец, функция инициализирует вывод подсистемы Amplifier
.
rtwdemodbtype(file,'SystemInitialize for Triggered SubSystem',... 'End of SystemInitialize for SubSystem',1,1)
/* SystemInitialize for Triggered SubSystem: '<Root>/Amplifier' */ /* SystemInitialize for Outport: '<Root>/Output' incorporates: * Outport: '<S1>/Out' */ rtwdemo_rtwintro_Y.Output = 0;
Осмотрите различие между хранимой суммой и реальным значением
Для некоторых данных, даже если реальное начальное значение является нулем, компьютерные магазины ненулевое значение в памяти. Чтобы наблюдать это различие, примените тип данных с фиксированной точкой наклонного смещения к состоянию блока, X
. Чтобы запустить этот пример, у вас должен быть Fixed-Point Designer™.
В Model Data Editor осмотрите вкладку Signals.
В модели кликните по выходному сигналу блока switch, switch_out
.
Используйте столбец Типа данных Model Data Editor, чтобы установить тип данных сигнала на fixdt(1,16,1,3)
. Это выражение представляет тип данных с фиксированной точкой с наклоном 1
и смещением 3
.
set_param('rtwdemo_rtwintro/Switch','OutDataTypeStr',... 'fixdt(1,16,1,3)')
В модели выберите View> Property Inspector и кликните по блоку Sum.
В Property Inspector, под Атрибутами Сигнала, ясными, Требуют, чтобы все входные параметры имели совпадающий тип данных.
set_param('rtwdemo_rtwintro/Sum','InputSameDT','off')
Чтобы предотвратить ошибки компиляции на других платформах, выбор образцовый параметр конфигурации Генерируют код только. Эта установка заставляет модель генерировать только код.
set_param('rtwdemo_rtwintro','GenCodeOnly','on')
Сгенерируйте код из модели.
rtwbuild('rtwdemo_rtwintro')
### Starting build procedure for model: rtwdemo_rtwintro ### Successful completion of code generation for model: rtwdemo_rtwintro
Образцовая функция инициализации сначала инициализирует X
к реальному наземному значению, 0
. Из-за типа данных наклонного смещения, который имеет, смещают 3
, это реальное значение соответствует хранимой сумме -3
.
rtwdemodbtype(file,'/* exported global states */','X = -3;',1,1)
/* exported global states */ X = -3;
Функция затем инициализирует X
к реальному начальному значению, которое вы задали в Начальных параметрах блоков условия, 5
. Это реальное значение соответствует хранимой сумме 2
.
rtwdemodbtype(file,'/* InitializeConditions for UnitDelay: ''<Root>/X'' */',... 'X = 2;',1,1)
/* InitializeConditions for UnitDelay: '<Root>/X' */ X = 2;
Цель | Больше информации |
---|---|
Поведение инициализации модели Explicitly при помощи блоков |
Можно явным образом смоделировать инициализацию и сбросить поведение при помощи, Инициализируют подсистемы Функции Функции и Сброса. В подсистемах используйте блоки Средства записи состояния, чтобы вычислить и присвоить начальное значение для состояния динамически. Соответствующий код появляется в образцовой функции инициализации. Для получения дополнительной информации смотрите, Генерируют Код, Который Отвечает, чтобы Инициализировать, Сбросить, и Оконечные События. |
Предотвратите генерацию кода, который явным образом инициализирует данные, чтобы обнулить |
Если ваша среда приложения уже инициализирует глобальные переменные, чтобы обнулить для более эффективного кода, можно предотвратить генерацию операторов, которые явным образом инициализируют глобальные переменные, чтобы обнулить. Эта оптимизация применяется только к сигналам и состояниям, начальные значения которых хранятся в памяти как нуль. Например, генератор кода не применяет оптимизацию к:
Оптимизация требует Embedded Coder. Для получения дополнительной информации смотрите, Удаляют Код Инициализации (Embedded Coder). |
Сгенерируйте код, который импортирует данные из вашего внешнего кода | Можно сгенерировать код, что повторные использования (импорт) данные, которые задает внешний код. Например, можно применить класс памяти
Для получения дополнительной информации, включая то, как препятствовать тому, чтобы сгенерированный код инициализировал импортированные данные, смотрите, обмениваются Данными Между Внешним Кодом Вызова и Сгенерированным кодом. |