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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Включите volatile type qualifier в определениях и объявлениях глобальных переменных. Требуется Embedded Coder. Смотрите Protect Global Data with const and volatile Type Qualifiers (Embedded Coder).

  • Поместите данные о состоянии в определенную область памяти. Требуется Embedded Coder. Смотрите Control Data and Function Placement in Memory by Inserting Pragmas (Embedded Coder).

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

Требования к состоянию, например, к модели rtwdemo_configrpinterface являются:

  • Сохраните данные о состоянии блока Unit Delay для доступности во время выполнения сгенерированного кода.

  • Представьте состояние как отдельную глобальную переменную.

  • Применить префикс dtemp_ к имени переменной, которая представляет состояние.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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: ExportedGlobal. Property Inspector shows Identifier property for state X set to dstate_X.

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

  6. Сгенерируйте и просмотрите код. Для примера, в rtwdemo_configrpinterface.cнайдите определения данных для данных о состоянии.

    real_T dstate_X;                        
    

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

    .
    .
    .
      if (mode) {
        output = (real_T)mp_K1 * dout_Table1;  
      } else {
        output = dstate_X;
      }
    .
    .
    .
       dstate_X = dout_Table2;
    }
    

Настройте настройки генерации кода для состояний программно

Чтобы автоматизировать строение состояний для генерации кода, используйте интерфейс программирования для отображений кода. Например, при создании пользовательских библиотек блоков или в рамках создания тестового окружения приложения используйте программный интерфейс для автоматизации строения данных.

В этом примере показано, как использовать интерфейс программирования для конфигурирования состояний для rtwdemo_configrpinterface модели. Установите представление состояний по умолчанию в сгенерированном коде как глобальные переменные. Затем сконфигурируйте состояние X блока Unit Delay для использования класса памяти по умолчанию и уникального идентификатора кода, который включает необходимый префикс dstate_.

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

    getDataDefault(cm,'InternalData','StorageClass')
    
    ans =
    
        'ExportedGlobal'
    
  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_configrpinterface.cнайдите определения данных для данных о состоянии.

    real_T dstate_X;                        
    

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

    .
    .
    .
      if (mode) {
        output = (real_T)mp_K1 * dout_Table1;  
      } else {
        output = dstate_X;
      }
    .
    .
    .
       dstate_X = dout_Table2;
    }
    

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

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

ТребованияКласс памяти
Пусть генератор кода обрабатывает, как представлять состояние в сгенерированном коде. Для примера в целях оптимизации генератор кода может исключить или изменить представление данных.Авто (только для отдельных отображений)
Для элементов данных, которые не могут быть оптимизированы, представьте данные как поле стандартной структуры данных.По умолчанию (только для отображения по умолчанию)
Предотвратите устранение оптимизации системы хранения данных для элемента данных и используйте отображение по умолчанию для категории элемента данных.Модель по умолчанию (только для отдельных отображений), Dictionary Default (Только отдельные отображения)
Сгенерируйте глобальное определение переменной и объявление.ExportedGlobal
Сгенерируйте код, который читается и записывается в глобальную переменную или глобальный указатель переменной, заданный вашим внешним кодом.ImportedExtern, ImportedExternPointer

Список доступных классов памяти может включать другие специфичные для проекта классы памяти, определенные в словаре Embedded Coder Dictionary. Если у вас есть особые требования, не удовлетворяющие перечисленным классам памяти, и вы имеете программное обеспечение Embedded Coder, можно задать класс памяти. Смотрите «Определение классов памяти», «Разделы памяти» и «Шаблоны функций» для программной архитектуры (Embedded Coder).

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

См. также

|

Похожие темы