Сконфигурируйте хранилища данных для генерации кода C

Хранилища данных позволяют подсистемам и ссылочным моделям обмениваться данными без использования портов ввода-вывода для передачи данных от уровня к уровню (см. «Основы хранилища данных и хранилища данных в Сгенерированном коде»). Типы хранилищ данных включают типы, перечисленные в этой таблице.

Тип хранилища данныхОписание
Локальное хранилище данныхХранилище данных, доступное из любого места в иерархии модели, которая находится на уровне или ниже уровня, на котором определяется хранилище данных. Можно задать локальное хранилище данных графически в модели путем включения блока 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®

    Для получения дополнительной информации об этих опциях смотрите Управляющие данные и Интерфейс функции в Сгенерированном коде.

Другие факторы для параметров модели включают в себя, следует ли:

Список требований к интерфейсам, относящихся к хранилищам данных с соответствующими классами памяти и свойствами класса памяти, см. в разделе Выбор классов памяти и свойств классов памяти для хранилищ данных.

Для примера модели 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 классификаторы типов.

  1. Откройте rtwdemo_configinterface модели. Сохраните копию модели в месте с возможностью записи.

    Simulink model to use for learning how to configure model data stores for code generation.

  2. Откройте приложение Embedded Coder.

  3. На вкладке C Code выберите Code Interface > Default Code Mappings.

  4. Сконфигурируйте отображения кода по умолчанию для локальных хранилищ данных. В редакторе Отображения на вкладке Data Defaults разверните узел Signals. Выберите категорию Signals, states, and internal data. Установите класс памяти равным FileScope.

    Code Mappings editor with Data Defaults tab selected, Signals tree node expanded, and storage class for Signals, states, and internal data set to FileScope.

  5. Сконфигурируйте отображения кода по умолчанию для общих локальных хранилищ данных. Выберите категорию Shared local data stores. Установите класс памяти равным Volatile.

  6. Сохраните модель.

Сконфигурируйте генерацию кода для отдельных хранилищ данных

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

Если ваша модель соответствует хотя бы одному из следующих критериев, рассмотрите настройку настроек генерации кода для хранилищ данных индивидуально:

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

  • Использует несколько хранилищ данных той же категории.

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

В этом примере показано, как использовать редактор Отображения для применения настройки класса памяти по умолчанию к блоку Data Store Memory mode в rtwdemo_configinterface модели. В примере также показано, как сконфигурировать идентификатор кода для этого хранилища данных.

  1. Если вы еще не сделали этого, выполните шаги в разделе Настройка настроек генерации кода по умолчанию для хранилищ данных.

  2. В редакторе Отображения перейдите на вкладку Data Stores. Разверните Local Data Stores. Класс памяти для mode хранилища данных установлено в Auto, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет строение модели по умолчанию. В данном примере строение модели по умолчанию задаёт класс памяти Volatile.

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

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

  3. В редакторе Отображения выберите локальное хранилище данных mode. Установите класс памяти равным Model default: Volatile.

  4. Сконфигурируйте идентификатор кода для хранилища данных с именем, которое включает префикс ds_. В редакторе Отображения выберите общее локальное хранилище данных mode. В Property Inspector разверните узел Code. Установите свойство класса памяти Identifier равным ds_mode.

    Code Mappings editor with Data Stores tab selected, Shared Local Data Stores tree node expanded, and storage class for data store mode set to Model default: Volatile. Property Inspector shows Identifier property for data store mode set to ds_mode.

  5. Сохраните модель.

  6. Сгенерируйте и просмотрите код. Для примера, в 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_.

  1. Откройте пример модели.

    open_system('rtwdemo_configinterface')
    
  2. Создайте объект cm вызовом функции coder.mapping.api.get. Объект хранит данные и строение генерации кода функции для модели rtwdemo_configinterface.

    cm = coder.mapping.api.get('rtwdemo_configinterface');
  3. Сконфигурируйте настройки по умолчанию для локальных хранилищ данных путем вызова функции setDataDefault. Для аргументов задайте следующие значения:

    • Объект, возвращенный coder.mapping.api.get

    • InternalData для категории по умолчанию

    • Имя свойства StorageClass со значением свойства FileScope

    setDataDefault(cm,'InternalData','StorageClass','FileScope');
  4. Сконфигурируйте настройки по умолчанию для общих локальных хранилищ данных путем вызова функции setDataDefault. Задайте следующие значения для аргументов:

    • Объект, возвращенный coder.mapping.api.get.

    • SharedLocalDataStore для категории по умолчанию.

    • Имя свойства StorageClass со значением свойства Volatile.

    setDataDefault(cm,'SharedLocalDataStore','StorageClass','Volatile');
  5. Проверьте настройки строения по умолчанию для локальных и общих локальных хранилищ данных. Выполните вызов для getDataDefault который задает объект, возвращенный coder.mapping.api.get, категория InternalData, и свойство StorageClass. При втором вызове getDataDefault, замените категорию на SharedLocalDataStore.

    getDataDefault(cm,'Internal','StorageClass')
    
    ans =
    
        'FileScope'
    
    getDataDefault(cm,'SharedLocalDataStore','StorageClass')
    
    ans =
    
        'Volatile'
    
  6. Примените строение по умолчанию для локального хранилища данных 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');
    
  7. Проверьте изменения строения путем вызова функции getDataStore. Задайте объект, возвращенный coder.mapping.api.get, имя хранилища данных и StorageClass свойств или Identifier.

    getDataStore(cm,'mode','StorageClass')
    
    ans =
    
        'Model default'
    
    getDataStore(cm,'mode','Identifier')
    
    ans =
    
        'ds_mode'
    
  8. Сохраните модель.

  9. Сгенерируйте и просмотрите код. Для примера, в 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

См. также

|

Похожие темы