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

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

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

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

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

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

Для примера модели rtwdemo_configrpinterfaceТребования к хранилищу данных:

  • Представление локальных и общих локальных хранилищ данных как отдельных глобальных переменных.

  • Применить префикс ds_ к именам переменных, представляющих хранилища данных.

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

Настройте настройки генерации кода по умолчанию для хранилищ данных

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

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

В этом примере показано, как использовать Code Mappings editor для настройки настроек по умолчанию для хранилищ данных. Используйте редактор Code Mappings, чтобы задать класс памяти по умолчанию для локальных и общих локальных хранилищ данных в rtwdemo_configrpinterface модели равным ExportedGlobal. С этими настройками класса памяти генератор кода представляет хранилища данных в сгенерированном коде как глобальные переменные.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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: ExportedGlobal. Property Inspector shows Identifier property for data store mode set to ds_mode.

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

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

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

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

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

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

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

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

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

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

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

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

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

    getDataDefault(cm,'InternalData','StorageClass')
    
    ans =
    
        'ExportedGlobal'
    
    getDataDefault(cm,'SharedLocalDataStore','StorageClass')
    
    ans =
    
        'ExportedGlobal'
    
  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_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 класса памяти, чтобы сконфигурировать имя для переменной, представляющей хранилище данных в сгенерированном коде.

См. также

|

Похожие темы