Сконфигурируйте состояния блока для генерации кода C

Состояния блока, такие как состояние блока Unit Delay, сохраняют значение состояния между циклами выполнения алгоритма. При конфигурировании модели для генерации кода можно сконфигурировать данные о состоянии на:

  • Минимизируйте объем данных, которые хранятся в памяти.

  • Управляйте, где генератор кода помещает данные о состоянии в память.

  • Продвигайте данные о состоянии в интерфейс модели, чтобы другие компоненты и системы могли получить доступ к этим данным.

  • Улучшите читаемость и трассируемость сгенерированного кода.

Для генерации кода примеры показывают, как сконфигурировать состояние блока для модели rtwdemo_configinterface. Можно сконфигурировать отображения кода с помощью интерфейса программирования Code Mappings editor или отображений кода (coder.mapping.api.CodeMapping).

Выберите опции строения кода для состояний

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

  • Настройка ли строения по умолчанию

    Если вам нужно получить доступ к значительному числу состояний (для примера более 10), более эффективно сконфигурировать состояния с настройками по умолчанию и затем переопределить эти настройки для особых случаев. Если вам нужно получить доступ к нескольким состояниям, которые имеют уникальные требования к источнику, именованию или размещению, рассмотрите настройку состояний по отдельности.

  • Как объявить и обработать данные о состоянии в сгенерированном коде

    • Как отдельные глобальные переменные

    • Чтобы считать входные данные из глобальных переменных, определенных во внешнем коде

    • Как вызовы для доступа к функциям. Требуется Embedded Coder®

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

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

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

Требования к состоянию, например, к модели 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.

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

    Simulink model to use for learning how to configure model states for code generation.

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

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

  4. В редакторе Отображения в разделе 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. Сохраните модель.

Настройте настройки генерации кода для отдельных состояний

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

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

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

  • Использует несколько состояний.

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

В этом примере показано, как использовать редактор Отображения для применения настройки класса памяти по умолчанию к состоянию блока Unit Delay X в rtwdemo_configinterface модели.

В примере также показано, как сконфигурировать идентификатор кода для этого состояния. Можно задать идентификаторы генерации кода, для примера для интегрирования, не изменяя проект модели.

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

  2. В редакторе Отображения перейдите на вкладку Signals/States. Разверните States. Класс памяти для состояния установлен в Auto, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет строение модели по умолчанию. В данном примере строение модели по умолчанию задаёт класс памяти FileScope.

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

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

  3. В редакторе Отображения выберите состояние X. Установите класс памяти равным.

  4. Сконфигурируйте идентификатор кода для состояния с именем, которое включает префикс dstate_. В редакторе Отображения выберите состояние X. В Property Inspector разверните узел Code. Затем установите свойство класса памяти Identifier равным dstate_X.

    Code Mappings editor with Signals/States tab selected, States tree node expanded, and storage class for state X set to Model default: FileScope. Property Inspector shows Identifier property for state X set to dstate_X.

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

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

  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. Проверьте свои строения по умолчанию для состояний. Выполните вызов для getDataDefault который задает объект, возвращенный coder.mapping.api.get и InternalData категорий. Задайте третий аргумент как свойство StorageClass.

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

    getState(cm,'X','StorageClass')
    
    ans =
    
        'Model default'
    
    getState(cm,'X','Identifier')
    
    ans =
    
        'dstate_X'
    
  7. Сохраните модель.

  8. Сгенерируйте и просмотрите код. Для примера, в 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
ExportToFileImportFromFile
Сгенерируйте переменные, которые являются локальными по отношению к функциям.Локализуемый
Сгенерируйте глобальную структуру, которая имеет имя, которое можно задать.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

См. также

|

Похожие темы