Состояния блока, такие как состояние блока Unit Delay, сохраняют значение состояния между циклами выполнения алгоритма. При конфигурировании модели для генерации кода можно сконфигурировать данные о состоянии на:
Минимизируйте объем данных, которые хранятся в памяти.
Управляйте, где генератор кода помещает данные о состоянии в память.
Продвигайте данные о состоянии в интерфейс модели, чтобы другие компоненты и системы могли получить доступ к этим данным.
Улучшите читаемость и трассируемость сгенерированного кода.
Для генерации кода примеры показывают, как сконфигурировать состояние блока для модели rtwdemo_configinterface
. Можно сконфигурировать отображения кода с помощью интерфейса программирования Code Mappings editor или отображений кода (coder.mapping.api.CodeMapping
).
На основе ваших требований к генерации кода решите, как представлять данные о состоянии. По умолчанию состояния в модели появляются в сгенерированном коде как поля структуры глобальных данных с именем
. Если вы не конфигурируете индивидуальных настроек, генератор кода определяет, устранять или изменять представление состояний в сгенерированном коде в целях оптимизации. Если вы конфигурируете индивидуальные настройки, решите:model
_DW
Настройка ли строения по умолчанию
Если вам нужно получить доступ к значительному числу состояний (для примера более 10), более эффективно сконфигурировать состояния с настройками по умолчанию и затем переопределить эти настройки для особых случаев. Если вам нужно получить доступ к нескольким состояниям, которые имеют уникальные требования к источнику, именованию или размещению, рассмотрите настройку состояний по отдельности.
Как объявить и обработать данные о состоянии в сгенерированном коде
Как отдельные глобальные переменные
Чтобы считать входные данные из глобальных переменных, определенных во внешнем коде
Как вызовы для доступа к функциям. Требуется Embedded Coder®
Для получения дополнительной информации об этих опциях смотрите Управляющие данные и Интерфейс функции в Сгенерированном коде.
Другие факторы включают в себя вопрос о том, следует ли:
Назовите состояния в сгенерированном коде при помощи меток состояний, которые появляются в модели или при помощи уникальных идентификаторов кода.
Включите volatile
type qualifier в определениях и объявлениях глобальных переменных. Требуется Embedded Coder. См. Раздел «Защита глобальных данных с помощью стандартных и энергозависимых классификаторов типов».
Поместите данные о состоянии в определенную область памяти. Требуется Embedded Coder. Смотрите Control Data and Function Placement in Memory путем вставки прагм.
Список требований к интерфейсам, релевантных для состояний с соответствующими классами памяти и свойствами класса памяти, см. в разделе Выбор классов памяти и свойств классов памяти для хранилищ данных.
Требования к состоянию, например, к модели rtwdemo_configinterface
являются:
Сохраните данные о состоянии блока Unit Delay для доступности во время выполнения сгенерированного кода.
Представьте состояние как отдельную глобальную переменную.
Применить префикс dtemp_
к имени переменной, которая представляет состояние.
В данном примере вы устанавливаете представление состояния по умолчанию в сгенерированном коде как глобальную переменную с static
type qualifier. Затем вы конфигурируете состояние блока Unit Delay, чтобы использовать класс памяти по умолчанию и уникальный идентификатор кода, который включает необходимый префикс dtemp_
. Возможность идентификатора кода позволяет вам задать идентификаторы генерации кода, не меняя проект модели.
Настройка генерации кода по умолчанию для состояний может уменьшить усилия по подготовке модели для генерации кода, особенно если модель имеет значительное количество состояний, к которым вы хотите получить доступ во время выполнения сгенерированного кода. Выберите настройки строения один раз, и генератор кода применяет эти настройки к состояниям в модели. Simulink® сохраняет строение по умолчанию как часть модели.
Рассмотрите конфигурирование настроек генерации кода по умолчанию для состояний модели, если ваша модель использует несколько состояний, которые не имеют уникальных требований, или использует общий словарь Embedded Coder.
В этом примере показано, как использовать Code Mappings editor для настройки настроек по умолчанию для состояний. Используйте редактор Code Mappings, чтобы задать класс памяти по умолчанию для состояний в модели rtwdemo_configinterface равным FileScope
. С помощью этой настройки класса памяти генератор кода представляет данные о состоянии в сгенерированном коде как глобальные переменные, которые имеют static
type qualifier.
Откройте rtwdemo_configinterface модели. Сохраните копию модели в месте с возможностью записи.
Откройте приложение Embedded Coder.
На вкладке C Code выберите Code Interface > Default Code Mappings.
В редакторе Отображения в разделе Signals выберите Signals, states, and internal data категории. Установите класс памяти по умолчанию равным FileScope
.
Сохраните модель.
Можно сконфигурировать отдельные состояния для генерации кода. Для примера, если модель имеет два состояния, которые имеют уникальные требования к генерации кода, сконфигурируйте состояния индивидуально. Или, если вы конфигурируете настройки по умолчанию для состояний, можно переопределить эти настройки для определенных состояний.
Если ваша модель соответствует хотя бы одному из следующих критериев, рассмотрите конфигурирование настроек генерации кода для состояний индивидуально:
Использует несколько состояний с уникальными требованиями к источнику, именованию или размещению.
Использует несколько состояний.
Имеет строение по умолчанию для состояний, и вам нужно переопределить строение для некоторых определенных состояний.
В этом примере показано, как использовать редактор Отображения для применения настройки класса памяти по умолчанию к состоянию блока Unit Delay X
в rtwdemo_configinterface модели
.
В примере также показано, как сконфигурировать идентификатор кода для этого состояния. Можно задать идентификаторы генерации кода, для примера для интегрирования, не изменяя проект модели.
Если вы еще не сделали этого, выполните шаги в разделе Настройка настроек генерации кода по умолчанию для состояний.
В редакторе Отображения перейдите на вкладку Signals/States. Разверните States. Класс памяти для состояния установлен в Auto
, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет строение модели по умолчанию. В данном примере строение модели по умолчанию задаёт класс памяти FileScope
.
Чтобы избежать оптимизации и заставить генератор кода использовать строение по умолчанию, установите класс памяти равным Model default
.
Чтобы переопределить строение по умолчанию, задайте класс памяти, который удовлетворяет требованиям генерации кода для этого состояния.
В редакторе Отображения выберите состояние X
. Установите класс памяти равным.
Сконфигурируйте идентификатор кода для состояния с именем, которое включает префикс dstate_
. В редакторе Отображения выберите состояние X
. В Property Inspector разверните узел Code. Затем установите свойство класса памяти Identifier равным dstate_X
.
Сохраните модель.
Сгенерируйте и просмотрите код. Для примера, в rtwdemo_configinterface.c
найдите определения данных для данных о состоянии.
static MYTYPE dstate_X;
Найдите, где данные о состоянии используются в функции точки входа шага.
. . . if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; } . . . dstate_X = dout_Table2; }
Чтобы автоматизировать строение состояний для генерации кода, используйте интерфейс программирования для отображений кода. Например, при создании пользовательских библиотек блоков или в рамках создания тестового окружения приложения используйте программный интерфейс для автоматизации строения данных.
В этом примере показано, как использовать интерфейс программирования для конфигурирования состояний для rtwdemo_configinterface модели. Установите представление состояний по умолчанию в сгенерированном коде как глобальные переменные, которые имеют static
type qualifier. Затем сконфигурируйте состояние X
блока Unit Delay для использования класса памяти по умолчанию и уникального идентификатора кода, который включает необходимый префикс dstate_
.
Откройте пример модели.
open_system('rtwdemo_configinterface')
Создайте объект cm
вызовом функции coder.mapping.api.get
. Объект хранит строение генерации кода для данных и функций для модели rtwdemo_configinterface
.
cm = coder.mapping.api.get('rtwdemo_configinterface');
Сконфигурируйте настройки по умолчанию для состояний путем вызова функции setDataDefault
. Для аргументов задайте следующие значения:
Объект, возвращенный coder.mapping.api.get
InternalData
для категории по умолчанию
Имя свойства StorageClass
со значением свойства FileScope
setDataDefault(cm,'InternalData','StorageClass','FileScope');
Проверьте свои строения по умолчанию для состояний. Выполните вызов для getDataDefault
который задает объект, возвращенный coder.mapping.api.get
и InternalData категорий
. Задайте третий аргумент как свойство StorageClass
.
getDataDefault(cm,'InternalData','StorageClass') ans = 'FileScope'
Примените строение по умолчанию для состояний к состоянию X
.
По умолчанию Simulink устанавливает класс памяти для отдельных состояний на Auto
. Генератор кода:
Определяет, следует ли исключить данные из сгенерированного кода в целях оптимизации.
При сохранении данных определяет, как эффективно представлять данные в сгенерированном коде с учетом настроек строения по умолчанию.
Чтобы управлять строением состояния, вызовите функцию setState
.
Выполните вызов для setState
который задает:
Объект, возвращенный coder.mapping.api.get
Имя состояния X
Класс памяти по умолчанию ранее устанавливался для состояний при помощи свойства StorageClass
и значение свойства Model default
.
Свойства Identifier
и значение свойства dstate_X
setState(cm,'X','StorageClass','Model default','Identifier','dstate_X');
Проверьте изменения строения путем вызова функции getState
. Задайте объект, возвращенный coder.mapping.api.get
, имя состояния и свойства StorageClass
или Identifier
.
getState(cm,'X','StorageClass') ans = 'Model default' getState(cm,'X','Identifier') ans = 'dstate_X'
Сохраните модель.
Сгенерируйте и просмотрите код. Для примера, в rtwdemo_configinterface.c
найдите определения данных для данных о состоянии.
static MYTYPE dstate_X;
Найдите, где данные о состоянии используются в функции точки входа шага.
. . . if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; } . . . dstate_X = dout_Table2; }
В зависимости от ваших требований к генерации кода выберите из этих классов памяти, чтобы сконфигурировать генерацию кода для состояний блока.
Требования | Класс памяти |
---|---|
Пусть генератор кода обрабатывает, как представлять состояние в сгенерированном коде. Для примера в целях оптимизации генератор кода может исключить или изменить представление данных. | Авто (только для отдельных отображений) |
Для элементов данных, которые не могут быть оптимизированы, представьте данные как поле стандартной структуры данных. | По умолчанию (только для отображения по умолчанию) |
Предотвратите устранение оптимизации системы хранения данных для элемента данных и используйте отображение по умолчанию для категории элемента данных. | Модель по умолчанию (только для отдельных отображений), Dictionary Default (Только отдельные отображения) |
Сгенерируйте структуру, которая хранит логические данные в именованных битовых полях. | Битовое поле (только для индивидуального отображения) |
Сгенерируйте глобальное определение переменной и объявление, которое имеет volatile type qualifier. | Volatile (См. Const, Volatile и ConstVolatile) |
Сгенерируйте глобальное определение переменной и объявление. | ExportedGlobal |
Сгенерируйте определение глобальной переменной и объявление в указанный файл. | ExportToFile |
Сгенерируйте глобальное определение переменной и объявление, которое имеет static type qualifier. | FileScope (только для локальных и общих локальных хранилищ данных) |
Сгенерируйте код, который взаимодействует с данными, вызывая пользовательские функции доступа. | GetSet |
Сгенерируйте код, который читается и записывается в глобальную переменную или глобальный указатель переменной, заданный вашим внешним кодом. | ImportedExtern, ImportedExternPointer |
ExportToFile | ImportFromFile |
Сгенерируйте переменные, которые являются локальными по отношению к функциям. | Локализуемый |
Сгенерируйте глобальную структуру, которая имеет имя, которое можно задать. | Struct (только для отдельных отображений) |
Список доступных классов памяти может включать другие специфичные для проекта классы памяти, определенные в словаре Embedded Coder Dictionary. Если у вас есть особые требования, не удовлетворяющие перечисленным классам памяти, и вы имеете программное обеспечение Embedded Coder, можно задать класс памяти. Смотрите раздел «Определение классов памяти, разделов памяти и шаблонов функций» для программной архитектуры.
Для отдельного состояния используйте свойство Identifier класса памяти, чтобы сконфигурировать имя для переменной, представляющей состояние в сгенерированном коде. С помощью Embedded Coder, в зависимости от выбранного класса памяти, можно также сконфигурировать эти свойства.
Свойство | Описание | Классы памяти |
---|---|---|
DefinitionFile | Исходный файл определения, который содержит определения для глобальных данных, которые считываются состоянием и внешним кодом | ExportToFile и Volatile |
GetFunction | Состояние появляется в сгенерированном коде как вызов к заданному get функция | GetSet |
HeaderFile | Исходный файл заголовка, содержащий объявления для глобальных данных, который считывается состоянием и внешним кодом | ExportToFile , GetSet , ImportFromFile , и Volatile |
Memory Section (только строение состояния по умолчанию) | Раздел памяти, содержащий данные, считанные состоянием | Default |
Owner | Генератор кода помещает определение для состояний в код, сгенерированный для одной из нескольких моделей в иерархии модели, которая разделяет определения. Необходимо выбрать параметр конфигурации модели Use owner from data object for data definition placement. См. Раздел «Управление размещением определений глобальных данных и объявлений в сгенерированных файлах». | ExportToFile и Volatile |
PreserveDimensions | Генератор кода сохраняет размерности данных о состоянии, которые представлены в сгенерированном коде как многомерный массив. Вы должны задать Array layout параметра конфигурации модели на Row-major . См. «Сохранение размерностей многомерных массивов в сгенерированном коде». | ExportToFile , FileScope , ImportFromFile , Localizable и Volatile |
SetFunction | Состояние появляется в сгенерированном коде как вызов к заданному set функция. | GetSet |
StructName | Имя структуры в сгенерированном коде для состояния. | BitField и Struct |
Редактор отображений кода | coder.mapping.api.CodeMapping