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