Хранилища данных позволяют подсистемам и ссылочным моделям обмениваться данными без использования портов ввода-вывода для передачи данных от уровня к уровню (см. «Основы хранилища данных и хранилища данных в Сгенерированном коде»). Типы хранилищ данных включают типы, перечисленные в этой таблице.
Тип хранилища данных | Описание |
---|---|
Локальное хранилище данных | Хранилище данных, доступное из любого места в иерархии модели, которая находится на уровне или ниже уровня, на котором определяется хранилище данных. Можно задать локальное хранилище данных графически в модели путем включения блока Data Store Memory или путем создания объекта сигнала (синтезированного хранилища данных) в рабочем пространстве модели. |
Общее локальное хранилище данных | Data Store Memory блок с параметрами блоков Share across model instances set. Эти хранилища данных доступны только в модели, где они определены. Значение хранилища данных разделяется между образцами модели. |
Глобальные данные | Хранилище данных, которое определяется сигнальным объектом в базовом рабочем пространстве или в словаре данных. Эти хранилища данных могут использоваться несколькими моделями в приложении. |
Когда вы открываете модель в приложении Embedded Coder, локальные и общие локальные хранилища данных появляются в редакторе Code Mappings, где можно настроить хранилища данных для генерации кода. Если модель использует глобальные данные хранилища, можно просмотреть их в редакторе Кода Отображений, нажав на Refresh
ссылка, которая отображается справа от имени хранилища данных. Эта ссылка инициирует схему обновления и добавляет глобальных данных хранилища, которые модель использует в представлении редактора.
Сконфигурируйте хранилища данных так:
Сделайте данные доступными для взаимодействия во время выполнения сгенерированного кода.
Управляйте, где генератор кода помещает данные в память.
Улучшите читаемость и трассируемость сгенерированного кода.
Для генерации кода примеры показывают, как сконфигурировать хранилище данных для модели rtwdemo_configinterface
. Можно сконфигурировать отображения кода с помощью Code Mappings editor или отображений кода API (coder.mapping.api.CodeMapping
).
По умолчанию локальные хранилища данных в модели появляются в сгенерированном коде как поля структуры глобальных данных с именем
. Общие локальные хранилища данных появляются как поле глобальных данных структуры model
_DW
. На основе требований к интерфейсам кода решите, настраивать ли генерацию кода хранилищ данных. Если вы не конфигурируете индивидуальных настроек, генератор кода определяет, устранять или изменять представление хранилищ данных в сгенерированном коде в целях оптимизации. Если вы конфигурируете индивидуальные настройки, решите:model
_SharedDSM
Настройка ли строения по умолчанию
Если модель включает значительное количество (для примера, более 10) хранилищ данных для заданной категории, которые должны быть доступны во время выполнения программы, более эффективно сконфигурировать хранилища данных с настройкой по умолчанию, а затем переопределить эту настройку для особых случаев. Если модель включает несколько хранилищ данных для данной категории, которые имеют уникальные требования к источнику, именованию или размещению, рассмотрите настройку хранилищ данных по отдельности.
Как объявить и обработать хранилища данных моделей в сгенерированном коде
Как отдельные глобальные переменные
Чтение из хранилищ данных как глобальных переменных, определенных во внешнем коде
Как вызовы для доступа к функциям. Требуется Embedded Coder®
Для получения дополнительной информации об этих опциях смотрите Управляющие данные и Интерфейс функции в Сгенерированном коде.
Другие факторы для параметров модели включают в себя, следует ли:
Назовите данные хранятся в сгенерированном коде при помощи имен хранилища данных в модели или при помощи уникальных идентификаторов кода.
Включите static
type qualifier в определениях глобальных переменных и объявлениях, например, для предотвращения конфликтов имен. Требуется Embedded Coder. См. раздел «Предотвращение конфликтов имен путем настройки элемента данных как статического».
Включите volatile
type qualifier в определениях и объявлениях глобальных переменных. Требуется Embedded Coder. См. Раздел «Защита глобальных данных с помощью стандартных и энергозависимых классификаторов типов».
Сгенерируйте структуру глобальных данных с заданным именем. Требуется Embedded Coder. См. раздел Организация данных в структуры в сгенерированном коде.
Поместите хранилища данных в определенную область памяти. Требуется Embedded Coder. Смотрите Control Data and Function Placement in Memory путем вставки прагм.
Список требований к интерфейсам, относящихся к хранилищам данных с соответствующими классами памяти и свойствами класса памяти, см. в разделе Выбор классов памяти и свойств классов памяти для хранилищ данных.
Для примера модели rtwdemo_configinterface
Требования к хранилищу данных:
Представление локальных хранилищ данных как отдельных глобальных переменных, определенных и объявленных с static
type qualifier.
Представление общих локальных хранилищ данных как отдельных глобальных переменных, определенных и объявленных с volatile
type qualifier.
Применить префикс ds_
к именам переменных, представляющих хранилища данных.
В данном примере вы устанавливаете представление по умолчанию для локальных хранилищ данных в сгенерированном коде как глобальные переменные, которые имеют static
type qualifier и общие локальные хранилища данных как глобальные переменные, которые имеют volatile
type qualifier. Затем вы конфигурируете локальное хранилище данных в модели, чтобы использовать класс памяти по умолчанию и уникальный идентификатор кода, который включает необходимый префикс ds_
. Возможность идентификатора кода позволяет вам задать идентификаторы генерации кода, не меняя проект модели.
Настройки генерации кода по умолчанию для хранилищ данных могут уменьшить усилия по подготовке модели к генерации кода, особенно если модель имеет значительное количество хранилищ данных, к которым вы хотите получить доступ во время выполнения сгенерированного кода. Выберите настройки строения один раз, и генератор кода применяет эти настройки к хранилищам данных по всей модели. Simulink® сохраняет строение по умолчанию как часть модели.
Рассмотрите конфигурирование настроек генерации кода по умолчанию для хранилищ данных моделей, если ваша модель использует несколько хранилищ данных для заданной категории, которые не имеют уникальных требований или используют общий словарь Embedded Coder.
В этом примере показано, как использовать Code Mappings editor для настройки настроек по умолчанию для хранилищ данных. Используйте редактор Code Mappings, чтобы задать класс памяти по умолчанию для локальных и общих локальных хранилищ данных в rtwdemo_configinterface модели равным
FileScope и
Volatile
, соответственно. С этими настройками класса памяти генератор кода представляет хранилища данных в сгенерированном коде как глобальные переменные, которые имеют static
и volatile
классификаторы типов.
Откройте rtwdemo_configinterface модели. Сохраните копию модели в месте с возможностью записи.
Откройте приложение Embedded Coder.
На вкладке C Code выберите Code Interface > Default Code Mappings.
Сконфигурируйте отображения кода по умолчанию для локальных хранилищ данных. В редакторе Отображения на вкладке Data Defaults разверните узел Signals. Выберите категорию Signals, states, and internal data. Установите класс памяти равным FileScope
.
Сконфигурируйте отображения кода по умолчанию для общих локальных хранилищ данных. Выберите категорию Shared local data stores. Установите класс памяти равным Volatile
.
Сохраните модель.
Для генерации кода можно сконфигурировать отдельные хранилища данных. Например, если у модели есть два хранилища данных одной категории, которые имеют уникальные требования к генерации кода, сконфигурируйте хранилища данных по отдельности. Или, если вы конфигурируете параметры по умолчанию для категории хранилищ данных, можно переопределить эти параметры для определенных хранилищ данных.
Если ваша модель соответствует хотя бы одному из следующих критериев, рассмотрите настройку настроек генерации кода для хранилищ данных индивидуально:
Использует несколько хранилищ данных одной категории, которые имеют уникальные требования к источнику, именованию или размещению.
Использует несколько хранилищ данных той же категории.
Имеет строение по умолчанию для категории хранилищ данных, и вам нужно переопределить строение для некоторых определенных состояний.
В этом примере показано, как использовать редактор Отображения для применения настройки класса памяти по умолчанию к блоку Data Store Memory mode
в rtwdemo_configinterface модели
. В примере также показано, как сконфигурировать идентификатор кода для этого хранилища данных.
Если вы еще не сделали этого, выполните шаги в разделе Настройка настроек генерации кода по умолчанию для хранилищ данных.
В редакторе Отображения перейдите на вкладку Data Stores. Разверните Local Data Stores. Класс памяти для mode
хранилища данных установлено в
Auto
, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет строение модели по умолчанию. В данном примере строение модели по умолчанию задаёт класс памяти Volatile
.
Чтобы избежать оптимизации и заставить генератор кода использовать строение по умолчанию, установите класс памяти равным Model default
.
Чтобы переопределить строение по умолчанию, задайте класс памяти, соответствующий требованиям генерации кода для этого хранилища данных.
В редакторе Отображения выберите локальное хранилище данных mode
. Установите класс памяти равным Model default: Volatile
.
Сконфигурируйте идентификатор кода для хранилища данных с именем, которое включает префикс ds_
. В редакторе Отображения выберите общее локальное хранилище данных mode
. В Property Inspector разверните узел Code. Установите свойство класса памяти Identifier равным ds_mode
.
Сохраните модель.
Сгенерируйте и просмотрите код. Для примера, в rtwdemo_configinterface.c
найдите определения данных для хранилища данных.
static boolean_T ds_mode;
Найдите, где данные о состоянии используются в функции точки входа шага.
. . . ds_mode = ((input1 > rtwdemo_configinterface_UPPER) || (input1 < rtwdemo_configinterface_LOWER)); . . . if (ds_mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; } . . .
Чтобы автоматизировать строение хранилищ данных для генерации кода, используйте интерфейс программирования для отображения кода. Например, при создании пользовательских библиотек блоков или части тестового окружения приложения используйте интерфейс программирования для автоматизации строения данных.
В этом примере показано, как использовать программный интерфейс для конфигурации хранилищ данных для rtwdemo_configinterface модели. Установите представление по умолчанию локальных и общих локальных хранилищ данных в сгенерированном коде как глобальные переменные, которые имеют static
и volatile
type qualifier, соответственно. Сконфигурируйте Data Store Memory блок mode
использовать класс памяти по умолчанию и уникальный идентификатор кода, включающий необходимый префикс ds_
.
Откройте пример модели.
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');
Сконфигурируйте настройки по умолчанию для общих локальных хранилищ данных путем вызова функции setDataDefault
. Задайте следующие значения для аргументов:
Объект, возвращенный coder.mapping.api.get
.
SharedLocalDataStore
для категории по умолчанию.
Имя свойства StorageClass
со значением свойства Volatile
.
setDataDefault(cm,'SharedLocalDataStore','StorageClass','Volatile');
Проверьте настройки строения по умолчанию для локальных и общих локальных хранилищ данных. Выполните вызов для getDataDefault
который задает объект, возвращенный coder.mapping.api.get
, категория InternalData
, и свойство StorageClass
. При втором вызове getDataDefault
, замените категорию на SharedLocalDataStore
.
getDataDefault(cm,'Internal','StorageClass') ans = 'FileScope' getDataDefault(cm,'SharedLocalDataStore','StorageClass') ans = 'Volatile'
Примените строение по умолчанию для локального хранилища данных mode
.
По умолчанию Simulink устанавливает класс памяти для хранилищ данных равным Auto
. Когда класс памяти Auto
, генератор кода:
Определяет, следует ли исключить данные из сгенерированного кода в целях оптимизации.
При сохранении данных определяет, как эффективно представлять данные в сгенерированном коде с учетом настроек строения по умолчанию.
Чтобы управлять строением для отдельного хранилища данных, вызовите функцию setDataStore
. Выполните вызов для setDataStore
который задает:
Объект, возвращенный coder.mapping.api.get
Имя хранилища данных mode
Класс памяти по умолчанию, ранее установленный для хранилища данных при помощи свойства StorageClass
и значение свойства Model default
.
Свойства Identifier
и значение свойства ds_mode
setDataStore(cm,'mode','StorageClass','Model default','Identifier','ds_mode');
Проверьте изменения строения путем вызова функции getDataStore
. Задайте объект, возвращенный coder.mapping.api.get
, имя хранилища данных и StorageClass свойств
или Identifier
.
getDataStore(cm,'mode','StorageClass') ans = 'Model default' getDataStore(cm,'mode','Identifier') ans = 'ds_mode'
Сохраните модель.
Сгенерируйте и просмотрите код. Для примера, в rtwdemo_configinterface.c
найдите определение данных для хранилища данных.
static boolean_T ds_mode;
Найдите, где хранилище данных используется в функции точки входа шага.
. . . ds_mode = ((input1 > rtwdemo_configinterface_UPPER) || (input1 < rtwdemo_configinterface_LOWER)); . . . if (ds_mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; } . . .
В зависимости от требований к генерации кода выберите из этих классов памяти для настройки генерации кода для хранилищ данных.
Требования | Класс памяти |
---|---|
Включите оптимизацию, потенциально создавая более эффективный код. | Авто (только для отдельных отображений) |
Для элементов данных, которые не могут быть оптимизированы, представьте данные как поле стандартной структуры данных. | По умолчанию (только для отображения по умолчанию) |
Предотвратите устранение оптимизации системы хранения данных для элемента данных и используйте класс памяти по умолчанию для категории элемента данных. | Модель по умолчанию (только для отдельных отображений), Dictionary Default (Только отдельные отображения) |
Сгенерируйте структуру, которая хранит логические данные в именованных битовых полях. | Битовое поле (только для индивидуального отображения) |
Сгенерируйте глобальное определение переменной и объявление, которое имеет volatile type qualifier. | Volatile (См. Const, Volatile и ConstVolatile) |
Сгенерируйте глобальное определение переменной и объявление. | ExportedGlobal |
Сгенерируйте определение глобальной переменной и объявление в указанный файл. | ExportToFile |
Сгенерируйте глобальное определение переменной и объявление, которое имеет static type qualifier. | FileScope (только для локальных и общих локальных хранилищ данных) |
Сгенерируйте код, который взаимодействует с данными, вызывая пользовательские функции доступа. | GetSet |
Сгенерируйте код, который читается и записывается в глобальную переменную или глобальный указатель переменной, заданный вашим внешним кодом. | ImportedExtern, ImportedExternPointer |
Сгенерируйте код, который читается и записывается в глобальную переменную, заданную вашим внешним заголовочным файлом. | 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