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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Включите 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 модели являются:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  2. В редакторе Отображения перейдите на вкладку Outports. Редактор перечисляет имена блоков Outport и элементов шины, которые находятся в модели. Если порт разрешается к объекту сигнала, справа от имени элемента появляется значок разрешения к объекту сигнала. Класс памяти для выходного порта в модели примера установлен на 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. Сконфигурируйте идентификатор кода для исходящего порта так, чтобы имя аргумента интерфейса в сгенерированном коде совпадало с именем интерфейса, используемого внешним кодом. В редакторе Отображения выберите строку для вывода. В Property Inspector задайте значение свойства Identifier 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, имя блока outport и 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 Dictionary. Если у вас есть особые требования, не удовлетворяющие перечисленным классам памяти, и вы имеете программное обеспечение Embedded Coder, можно задать класс памяти. Смотрите «Определение классов памяти», «Разделы памяти» и «Шаблоны функций» для программной архитектуры (Embedded Coder).

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

См. также

|

Похожие темы