Инициализация сигнала, состояния и данных о параметре в сгенерированном коде

Сигнальные линии, параметры блоков и состояния блока в модели могут появиться в сгенерированном коде как данные, например, как глобальные переменные. По умолчанию код инициализирует эти данные перед осуществлением первичного алгоритма. Чтобы совпадать с численными данными симуляции в Simulink®, генератор кода выбирает начальные значения на основе технических требований, которые вы делаете в модели.

Путем понимания, как сгенерированный код инициализирует данные, вы можете:

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

  • Сохраните начальные значения в памяти как переменные, которые могут сохраниться между запусками выполнения. Можно затем перезаписать эти значения прежде, чем запустить или перезапустить систему.

  • Сгенерируйте эффективный код путем устранения устройства хранения данных для инвариантных начальных значений и путем предотвращения генерации кода, который излишне или избыточно инициализирует данные.

Для основной информации об инициализации сигналов и состояний в модели, смотрите, Инициализируют Сигналы и Дискретные состояния и информацию о состоянии Загрузки.

Статическая инициализация и динамическая инициализация

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

  • Статическая инициализация происходит в том же операторе, который задает (выделяет память для), переменная. Инициализация не происходит в функциональном определении.

    Код может быть более эффективным, потому что ни одна из сгенерированных функций модели не выполняет операторы инициализации.

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

    Сгенерированный код или ваш код могут перезапустить систему путем вызывания функции инициализации во время выполнения.

Реальная наземная инициализация, требующая ненулевой комбинации двоичных разрядов

Каждый элемент данных имеет реальный ground value. Это значение может зависеть от типа данных элемента. Например, для сигнала, типом данных которого является double или int8, реальное наземное значение является нулем. Для перечисления наземное значение является членом перечисления по умолчанию.

Для некоторых видов данных, чтобы представлять реальное наземное значение, компьютерные магазины обнуляют в памяти (весь нуль битов). Однако для некоторых других данных, компьютерные магазины ненулевое значение в памяти. Эти данные включают, например:

  • Данные фиксированной точки со смещением. Код инициализирует такой элемент данных к сохраненному целочисленному значению, которое, учитывая масштабирование и смещение, представляет реальный нуль.

  • Перечисление, чей член по умолчанию сопоставляет с целочисленным значением кроме нуля. Например, если членом по умолчанию является High с базовым целочисленным значением 3, код инициализирует такой элемент данных к High.

Инициализация данных состояния и сигнала

В модели вы можете управляющий сигнал и утверждать начальные значения через параметры блоков. Например, чтобы установить начальное значение блока Unit Delay, вы используете параметр Initial condition. В некоторых случаях можно также использовать InitialValue свойство Simulink.Signal объект. Для большинства этих параметров блоков значением по умолчанию является 0.

Можно также инициализировать состояния при помощи блоков State Writer в подсистемах Initialize Function и параметре конфигурации модели Initial states.

По умолчанию сгенерированный код динамически инициализирует данные состояния и сигнала (и другие данные, такие как ошибочное состояние модели) в сгенерированной функции инициализации. Функция, названная model_initialize по умолчанию, выполняет операции инициализации состояния и сигнала в этом порядке:

  1. Инициализирует данные состояния и сигнала в сгенерированных структурах значения по умолчанию, таких как структура DWork, к хранимой сумме нуля.

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

    Эта инициализация применяется только к данным, которые соответствуют обоим из этих критериев:

    • Сгенерированный код задает (выделяет память для), данные.

    • Данные используют класс памяти кроме Auto (класс памяти по умолчанию) или Model default (когда Код, Сопоставляющий Редактор, задает Default класс памяти, настройка по умолчанию).

    Например, код применяет эту операцию к элементам данных, которые используют класс памяти ExportedGlobal.

  3. Инициализирует каждый сигнал и состояние к реальному значению, которое модель задает, например, через параметр Initial condition блока Unit Delay.

  4. Инициализирует каждое состояние к реальному значению, которое вы присваиваете при помощи блока State Writer. Функция выполняет эту инициализацию, только если вы используете подсистему Initialize Function в модели.

  5. Инициализирует каждое состояние к реальному значению, что вы задаете с параметром конфигурации Initial states.

После того, как эта функция инициализации выполняется, каждый элемент данных имеет последнее реальное значение, которое присвоила функция. Например, если вы используете блок State Writer, чтобы инициализировать состояние блока к 5 также с помощью параметра конфигурации Initial states, чтобы инициализировать то же состояние к 10, состояние в конечном счете использует 10 как начальное значение.

memset для объемной инициализации

Чтобы инициализировать элементы данных состояния или сигнала, которые имеют непрерывное устройство хранения данных к хранимой сумме нуля, сгенерированный код может вызвать memset в функции инициализации. Элементы данных, которые имеют непрерывное устройство хранения данных, включают структуру DWork, массивы или элементы данных, которые используют тип данных многословный.

Если ваше приложение требует его, можно препятствовать тому, чтобы сгенерированный код использовал memset для инициализации данных с плавающей точкой к сохраненному нулю. Смотрите Использование memset, чтобы инициализировать плавания, и удваивается до 0,0.

Настраиваемые начальные значения

Можно сконфигурировать способ, которым настраиваемые параметры блоков, такие как параметр Gain блока Gain, появляются в сгенерированном коде. Большинство параметров блоков, которые устанавливают начальные значения (например, Initial condition) является настраиваемым. Например, параметр конфигурации, который может определить Default parameter behavior, появляются ли начальные значения в сгенерированном коде как встроенные константы или как настраиваемые глобальные данные. Можно также использовать объекты параметра и классы памяти, чтобы управлять представлением этих начальных значений.

Для настраиваемых начальных значений, в функции инициализации модели, правая сторона оператора присваивания является глобальной переменной, полем структуры или другими данными, значение которых можно изменить в памяти.

Чтобы сделать начальные значения настраиваемыми в сгенерированном коде, смотрите Управляющий сигнал и Инициализацию состояния в Сгенерированном коде.

Инициализация данных о параметре

Сгенерированный код статически инициализирует данные о параметре к значениям, которые вы задаете в Simulink.

Чтобы описать начальное значение настраиваемого параметра (глобальная переменная) как математическое выражение, включающие системные константы или другие макросы, которые требуют Embedded Coder®, видят Инициализацию Математическим выражением (Embedded Coder).

Виды данных о параметре

Эти элементы модели появляются в сгенерированном коде как данные о параметре:

  • Настраиваемые параметры блоков, такие как параметр Gain блока Gain, когда вы устанавливаете Default parameter behavior на Tunable. Каждый параметр появляется как поле специализированной глобальной структуры.

  • Некоторые настраиваемые параметры блоков, когда вы устанавливаете Default parameter behavior на Inlined. Когда генератор кода не может встроить значение параметра как литеральный номер, параметр появляется как поле специализированного глобального const структура.

  • Simulink.Parameter объекты, к которым вы применяете класс памяти, который имеет экспортируемый осциллограф данных. Например, встроенный класс памяти ExportedGlobal имеет экспортируемый осциллограф данных, но класс памяти ImportedExtern не делает.

Инициализация математическим выражением (Embedded Coder)

Можно установить значение объекта параметра (такого как Simulink.Parameter) к математическому выражению включающие числа, переменные MATLAB® и другие объекты параметра. Смотрите Установленное Значение переменных при помощи Математического выражения.

Если вы используете этот метод с Embedded Coder, можно сгенерировать код, который инициализирует соответствующие данные о параметре (глобальная переменная) при помощи заданного выражения. Для примера смотрите, Инициализируют Значение параметров От Системы Постоянный или Другой Макрос (Embedded Coder) (Embedded Coder). Для получения общей информации, включая ограничения, смотрите Генерацию кода Объектов параметра Со Значениями Выражения.

Инициализация данных в сгенерированном коде

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

Исследуйте модель в качестве примера

Откройте модель в качестве примера, rtwdemo_rtwintro.

open_system('rtwdemo_rtwintro')

В галерее Apps нажмите Simulink Coder.

Откройте Model Data Editor. На вкладке Modeling нажмите Model Data Editor.

Смотрите вкладку Штатов. Для состояния блока Unit Delay Начальное значение установлено к 0, значением по умолчанию, что означает начальное значение состояния, является нуль. Состояние называют X.

Установите Начальное значение к ненулевому номеру, например, 5.

set_param('rtwdemo_rtwintro/X','InitialCondition','5')

Откройте редактор Отображений Кода. Во вкладке C Code выберите Code Interface> Individual Element Code Mappings.

На вкладке Signals/States, под состояниями устанавливает Класс памяти для X к ExportedGlobal. С этой установкой состояние блока появляется в сгенерированном коде как отдельная глобальная переменная.

coder.mapping.utils.create('rtwdemo_rtwintro');
cm = coder.mapping.api.get('rtwdemo_rtwintro');
setState(cm,'rtwdemo_rtwintro/X','StorageClass','ExportedGlobal');

В модели откройте Amplifier подсистема, которая является триггируемой подсистемой.

В Model Data Editor смотрите вкладку Parameters. Чтобы установить и смотреть начальные значения сигналов и состояний, можно использовать вкладку 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 объект.

В редакторе Отображений Кода, на вкладке Parameters, применяют класс памяти ExportedGlobal к INC. С этой установкой сгенерированный код задает INC как глобальная переменная. Относительно инициализации, INC элемент данных о параметре.

INC = Simulink.Parameter(INC);
INC.StorageClass = 'ExportedGlobal';

Сгенерируйте и смотрите код

Чтобы создать модель и сгенерировать код, нажмите Ctrl+B.

rtwbuild('rtwdemo_rtwintro');
### Starting build procedure for: rtwdemo_rtwintro
### Successful completion of build procedure for: rtwdemo_rtwintro

Build Summary

Top model targets built:

Model             Action                       Rebuild Reason                                    
=================================================================================================
rtwdemo_rtwintro  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 18.486s

В сгенерированном файле 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));

Функция затем инициализирует состояние Unit Delay, 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)')

В модели выберите блок Sum. В Property Inspector, под Атрибутами Сигнала, ясными, Требуют, чтобы все входные параметры имели совпадающий тип данных.

set_param('rtwdemo_rtwintro/Sum','InputSameDT','off')

Чтобы предотвратить ошибки компиляции на других платформах, выбор параметр конфигурации модели Генерируют код только. Эта установка заставляет модель генерировать только код.

set_param('rtwdemo_rtwintro','GenCodeOnly','on')

Чтобы создать модель и сгенерировать код, нажмите Ctrl+B.

rtwbuild('rtwdemo_rtwintro')
### Starting build procedure for: rtwdemo_rtwintro
### Successful completion of code generation for: rtwdemo_rtwintro

Build Summary

Top model targets built:

Model             Action          Rebuild Reason                   
===================================================================
rtwdemo_rtwintro  Code generated  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 7.0981s

Функция инициализации модели сначала инициализирует 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 при помощи блоков

Можно явным образом смоделировать инициализацию и сбросить поведение при помощи подсистем Reset Function и Initialize Function. В подсистемах используйте блоки State Writer, чтобы вычислить и присвоить начальное значение для состояния динамически. Соответствующий код появляется в функции инициализации модели.

Для получения дополнительной информации смотрите, Генерируют Код, Который Отвечает, чтобы Инициализировать, Сбросить, и Оконечные События.

Предотвратите генерацию кода, который явным образом инициализирует данные, чтобы обнулить

Если ваша среда приложения уже инициализирует глобальные переменные, чтобы обнулить для более эффективного кода, можно предотвратить генерацию операторов, которые явным образом инициализируют глобальные переменные, чтобы обнулить. Эта оптимизация применяется только к сигналам и состояниям, начальные значения которых хранятся в памяти как нуль. Например, генератор кода не применяет оптимизацию к:

  • Данные, для которых вы задаете ненулевое начальное значение при помощи параметров блоков.

  • Данные, реальное начальное значение которых является нулем, но чья соответствующая хранимая сумма не является нулем.

  • Перечислимые данные, чей член по умолчанию сопоставляет с ненулевым целым числом.

Оптимизация требует Embedded Coder. Для получения дополнительной информации смотрите, Удаляют Нулевой Код Инициализации (Embedded Coder).

Сгенерируйте код, который импортирует данные из вашего внешнего кода

Можно сгенерировать код, что повторные использования (импорт) данные, которые задает внешний код. Например, можно применить класс памяти ImportedExtern к сигнальной линии, состоянию блока или объекту параметра. Для импортированных данных:

  • Сгенерированный код не инициализирует данные о параметре. Ваш код должен инициализировать импортированные данные о параметре.

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

Для получения дополнительной информации, включая то, как препятствовать тому, чтобы сгенерированный код инициализировал импортированные данные, смотрите, обмениваются Данными Между Внешним Кодом Вызова и Сгенерированным кодом.

Смотрите также

Похожие темы