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

Чтобы использовать код, который вы генерируете из модели, вы вызываете сгенерированные функции точки входа. Вызывающее окружение и сгенерированные функции обмениваются входными и выходными данными, для примера, как глобальные переменные или аргументы функции. Блоки Outport корневого уровня (outports) составляют выходные данные интерфейса. Чтобы интегрировать и развернуть сгенерированный код в больших приложениях, можно настроить, как генератор кода производит код интерфейса, включая то, как объявляются и обрабатываются выходные данные. Индивидуальные настройки могут:

  • Минимизируйте изменения, которые вы вносите в существующий код.

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

  • Сгенерируйте код, который обменивается данными более эффективно (для примера, с помощью указателей и аргументов pass-by-reference для нескалярных данных).

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

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

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

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

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

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

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

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

    • Для ссылочных выходных портов модели как глобальных переменных (void-void)

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

    • Как аргументы функции точки входа. Требуется Embedded Coder

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

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

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

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

  • Используйте определение типа проекта MYTYPE определено в rtwdemo_configinterface_data.m.

  • Объявить переменную для outport Out1 в сгенерированном внешнем заголовочном файле exOutSys.h и определите переменную в исходном файле определения exOutSys.c. Данные, записанные в Out1 - выход кода, сгенерированного для блока Switch.

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

В данном примере сконфигурируйте выходной порт в rtwdemo_configinterface для соответствия этим требованиям генерации кода.

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

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

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

Пример модели rtwdemo_configinterface включает один выходной порт корневого уровня. В этом примере показано, как использовать Code Mappings editor для настройки параметров по умолчанию для выходных портов корневого уровня. Укажите, что генератор кода объявляет и задает переменные, чтобы представлять корневые выходные порты в сгенерированных внешних файлах заголовка и определения. Назовите сгенерированный файл внешнего заголовка по умолчанию exOutSys.h и сгенерированный файл определения exOutSys.c.

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

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

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

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

  4. В редакторе Отображения в разделе Inports and Outports выберите Outports категории. Установите класс памяти по умолчанию равным ExportToFile.

  5. В Property Inspector установите значение файла заголовка на exOutSys.h и файл определения для exOutSys.c.

    Code Mappings editor with Data Defaults tab selected, Inports and Outports tree node expanded, and storage class for Outports set to ExportToFile. Property Inspector with HeaderFile property set to exOutSys.h and DefinitionFile property set to exOutSys.c.

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

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

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

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

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

  • Использует немного выходов.

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

В этом примере показано, как использовать редактор Отображения для применения строения генерации кода по умолчанию для outports в модели rtwdemo_configinterface. В предыдущем примере класс памяти по умолчанию для выходных портов устанавливается равным ExportToFile. Требование задает, что outport Out1 запись выходных данных в глобальную переменную, объявленную и определенную в сгенерированных файлах заголовка и определения, доступных для внешнего кода.

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

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

  2. В редакторе Отображения перейдите на вкладку Outports. Редактор перечисляет имена блоков Outport и элементов шины, которые находятся в модели. Если порт разрешается к объекту сигнала, справа от имени элемента появляется значок разрешения к объекту сигнала. Класс памяти для выходного порта в модели примера установлен на Auto, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет строение модели по умолчанию. В данном примере строение модели по умолчанию задаёт класс памяти ExportToFile.

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

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

  3. Сконфигурируйте генератор кода, чтобы применить настройку класса памяти по умолчанию к выходу Out1. Выберите строку для вывода. Установите класс памяти равным Model default: ExportToFile.

    Code Mappings editor with Outports tab selected, outport Out1 selected, and storage class being set to Model default: ExportToFile.

    Класс памяти для выбранного выходного порта изменяется на Model default: ExportToFile.

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

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

  6. Сгенерируйте и просмотрите код. Для примера в файл rtwdemo_configinterface.c, найти, где переменная output используется в функции точки входа шага.

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

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

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

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

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

  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

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

    • Имя свойства StorageClass который имеет значение свойства ExportToFile

    • Имя свойства HeaderFile который имеет значение свойства exOutSys.h и имя свойства DefinitionFile который имеет значение свойства exOutSys.c, имена для сгенерированных файлов, которые объявляют и определяют выходные данные

    setDataDefault(cm,'Outports','StorageClass','ExportToFile','HeaderFile','exOutSys.h',...
    'DefinitionFile','exOutSys.c')
  4. Проверьте свои строения по умолчанию для выходных портов. Выполните три вызова getDataDefault который задает объект, возвращенный coder.mapping.api.get и Outports категорий.

    • В первом вызове задайте третий аргумент как свойство StorageClass.

    • Во втором вызове для третьего аргумента задайте HeaderFile.

    • В третьем вызове для третьего аргумента задайте DefinitionFile.

    getDataDefault(cm,'Outports','StorageClass')
    
    ans =
    
        'ExportToFile'
    
    getDataDefault(cm,'Outports','HeaderFile')
    
    ans =
    
        'exOutSys.h'
    
    getDataDefault(cm,'Outports','DefinitionFile')
    
    ans =
    
        'exOutSys.c'
    
  5. Примените строение выходного порта по умолчанию для выходного Out1.

    По умолчанию Simulink устанавливает класс памяти для отдельных выходных портов равным Auto. Когда класс памяти Auto, генератор кода:

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

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

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

    Выполните вызов для setOutport который задает:

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

    • Имя блока вывода Out1

    • Класс памяти по умолчанию, ранее установленный для исходящего порта при помощи свойства StorageClass и значение свойства Model default

    • Свойства Identifier и значение свойства output

    setOutport(cm,'Out1','StorageClass','Model default','Identifier','output');
    
  6. Проверьте изменения строения путем вызова функции getOutport. Задайте объект, возвращенный coder.mapping.api.get, имя блока outport и StorageClass свойств или Identifier.

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

  8. Сгенерируйте и просмотрите код. Для примера в файл rtwdemo_configinterface.c, найти, где переменная output используется в функции точки входа шага.

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

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

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

ТребованияКласс памяти
Включите оптимизацию, потенциально создавая более эффективный код.Авто (только для отдельных отображений)
Для элементов данных, которые не могут быть оптимизированы, представьте данные как поле стандартной структуры данных.По умолчанию (только для отображения по умолчанию)
Предотвратите устранение оптимизации системы хранения данных для элемента данных и используйте отображение по умолчанию для категории элемента данных.Модель по умолчанию (только для отдельных отображений), Dictionary Default (Только отдельные отображения)
Сгенерируйте структуру, которая хранит логические данные в именованных битовых полях.Битовое поле (только для отдельных отображений)
Сгенерируйте глобальное определение переменной и объявление, которое имеет volatile type qualifier.Volatile (См. Const, Volatile и ConstVolatile)
Сгенерируйте глобальное определение переменной и объявление.ExportedGlobal
Сгенерируйте определение глобальной переменной и объявление в указанный файл.ExportToFile
Сгенерируйте код, который взаимодействует с данными, вызывая пользовательские функции доступа.GetSet
Сгенерируйте код, который читается и записывается в глобальную переменную или глобальный указатель переменной, заданный вашим внешним кодом.ImportedExtern, ImportedExternPointer
Сгенерируйте код, который читается и записывается в глобальную переменную, заданную вашим внешним заголовочным файлом.ImportFromFile
Сгенерируйте переменные, которые являются локальными по отношению к функциям.Локализуемый
Сгенерируйте глобальную структуру, которая имеет имя, которое можно задать.Struct (только для отдельных отображений)

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

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

СвойствоОписаниеКлассы памяти
DefinitionFileИсходный файл определения, который содержит определения для глобальных данных, которые считываются выходным и внешним кодомExportToFile и Volatile
GetFunctionOutport появляется в сгенерированном коде как вызов к заданному 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, ImportFromFile, Localizable, и Volatile
SetFunctionOutport появляется в сгенерированном коде как вызов к заданному set функция.GetSet
StructNameИмя структуры в сгенерированном коде для вывода.BitField и Struct

См. также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте