exponenta event banner

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

Для использования кода, создаваемого на основе модели, следует вызвать сгенерированные функции точки входа. Среда вызова и сгенерированные функции обмениваются входными и выходными данными, например, в виде глобальных переменных или аргументов функции. Блоки аутпорта корневого уровня (аутпорты) составляют выходные данные интерфейса. Для интеграции и развертывания созданного кода в более крупных приложениях можно настроить способ создания кода интерфейса генератором кода, включая способ объявления и обработки выходных данных. Настройки могут:

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

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

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

Для создания кода в примерах показано, как настроить интерфейс исходящего порта для модели rtwdemo_configinterface. Можно настроить сопоставления кода с помощью редактора сопоставлений кода или API-интерфейса сопоставлений кода (coder.mapping.api.CodeMapping).

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

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

  • Настройка конфигурации по умолчанию

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

  • Объявление и обработка данных исходящего порта в сгенерированном интерфейсе

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

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

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

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

    • В качестве аргументов функции начальной точки. Требуется встроенный кодер

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

Другие соображения включают в себя необходимость:

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

Требования к интерфейсу исходящего порта, например, модель rtwdemo_configinterface являются:

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

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

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

Для этого примера настройте внешний порт в rtwdemo_configinterface в соответствии с этими требованиями к созданию кода.

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

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

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

Пример модели rtwdemo_configinterface включает один выезд на корневом уровне. В этом примере показано, как использовать редактор сопоставления кодов для настройки параметров по умолчанию для выходов на корневом уровне. Укажите, что генератор кода объявляет и определяет переменные для представления корневых выходов в созданных внешних файлах заголовка и определений. Имя созданного внешнего файла заголовка по умолчанию 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 выберите Интерфейс кода > Сопоставления кодов по умолчанию.

  4. В редакторе сопоставлений кодов в разделе «Порты ввода» и «Порты вывода» выберите категорию «Порты вывода». Задать класс хранения по умолчанию как ExportToFile.

  5. В инспекторе свойств задайте для параметра «Файл заголовка» значение 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. Сохраните модель.

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

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

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

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

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

  • Имеет конфигурацию по умолчанию для выходов и необходимо переопределить конфигурацию для некоторых определенных выходов.

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

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

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

  2. В редакторе сопоставлений кодов перейдите на вкладку «Выходы». Редактор перечисляет имена блоков Outport и элементов шины, которые находятся в модели. Если порт получает разрешение на сигнальный объект, справа от имени элемента появляется значок «resolve-to-signal-object». Класс хранения для исходящего порта в модели примера имеет значение 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. Настройте идентификатор кода для исходящего порта таким образом, чтобы имя аргумента интерфейса в сгенерированном коде совпадало с именем интерфейса, используемым внешним кодом. В редакторе сопоставлений кодов выберите строку для исходящего порта. В инспекторе свойств задайте для свойства «Идентификатор» значение 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, имя блока исходящего порта и свойство 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 (Только отдельные сопоставления)
Создание структуры, хранящей логические данные в именованных битовых полях.Bitfield (только отдельные сопоставления)
Создание определения и объявления глобальной переменной с volatile квалификатор типа.Volatile (См. Const, Volatile и ConstVolatile)
Создание определения и объявления глобальной переменной.ExportedGlobal
Создание определения и объявления глобальной переменной для указанного файла.ExportToFile
Создайте код, который взаимодействует с данными, вызвав пользовательские функции доступа.GetSet
Создание кода, считывающего и записывающего в глобальную переменную или указатель глобальной переменной, определенный внешним кодом.ImportedExtern, ImportedExternPointer
Создание кода, который считывает и записывает в глобальную переменную, определенную внешним заголовочным файлом.ImportFromFile
Создание переменных, локальных для функций.Локализуемый
Создайте глобальную структуру с именем, которое можно указать.Структура (только отдельные сопоставления)

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

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

СобственностьОписаниеКлассы хранения
DefinitionFileФайл определения источника, содержащий определения глобальных данных, считываемый внешним и внешним кодомExportToFile и Volatile
GetFunctionOutport отображается в сгенерированном коде как вызов указанного get функцияGetSet
HeaderFileИмя созданного исходного заголовочного файла, содержащего объявления для глобальных данных, которые записываются исходящим и внешним кодомExportToFile, GetSet, ImportFromFile, и Volatile
Memory Section(только конфигурация исходящего порта по умолчанию)Раздел памяти, содержащий данные, записанные аутпортомDefault
OwnerГенератор кода помещает определение для выходов в код, созданный для одной из нескольких моделей в иерархии моделей, которые совместно используют определения. Необходимо выбрать параметр конфигурации модели Использовать владельца из объекта данных для размещения определения данных. См. раздел Управление размещением глобальных определений и деклараций данных в созданных файлах.ExportToFile и Volatile
PreserveDimensionsГенератор кода сохраняет размеры выходных данных, которые представлены в сформированном коде в виде многомерного массива. Необходимо установить параметр конфигурации модели Array layout равным Row-major. См. раздел Сохранение измерений многомерных массивов в сгенерированном коде.ExportToFile, ImportFromFile, Localizable, и Volatile
SetFunctionOutport отображается в сгенерированном коде как вызов указанного set функция.GetSet
StructNameИмя структуры в созданном коде для экспорта.BitField и Struct

См. также

|

Связанные темы