exponenta event banner

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Переменная, представляющая исходящий порт в созданном коде, должна иметь имя output.

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

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

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

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

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

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

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

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

  3. На вкладке Код C выберите Интерфейс кода > Сопоставления кодов по умолчанию.

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

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

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

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

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

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

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

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

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

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

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

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

  2. В редакторе сопоставлений кодов перейдите на вкладку «Выходы». Редактор перечисляет имена блоков Outport и элементов шины, которые находятся в модели. Если порт получает разрешение на сигнальный объект, справа от имени элемента появляется значок «resolve-to-signal-object». Класс хранения для исходящего порта в модели примера имеет значение Auto, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет конфигурацию модели по умолчанию. В этом примере конфигурация модели по умолчанию определяет класс хранения ExpotedGlobal.

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

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

  3. Настройка генератора кода для применения параметра класса хранения по умолчанию к исходящему порту Out1. Выберите строку для исходящего порта. Задайте для класса хранения значение Model default: ExportedGlobal.

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

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

  4. Настройте идентификатор кода для исходящего порта таким образом, чтобы имя аргумента интерфейса в сгенерированном коде совпадало с именем интерфейса, используемым внешним кодом. В редакторе сопоставлений кодов выберите строку для исходящего порта. В инспекторе свойств задайте для свойства «Идентификатор» значение output.

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

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

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

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

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

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

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

  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

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

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

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

    getDataDefault(cm,'Outports','StorageClass')
    
    ans =
    
        'ExportedGlobal'
    
  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_configrpinterface.c, найдите, где переменная output используется в функции начального уровня шага.

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

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

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

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

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

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

См. также

|

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