Чтобы использовать код, который вы генерируете из модели, вы вызываете сгенерированные функции точки входа. Вызывающее окружение и сгенерированные функции обмениваются входными и выходными данными, для примера, как глобальные переменные или аргументы функции. Блоки Outport корневого уровня (outports) составляют выходные данные интерфейса. Чтобы интегрировать и развернуть сгенерированный код в больших приложениях, можно настроить, как генератор кода производит код интерфейса, включая то, как объявляются и обрабатываются выходные данные. Индивидуальные настройки могут:
Минимизируйте изменения, которые вы вносите в существующий код.
Сгенерируйте стабильные интерфейсы, которые не изменяются или минимально изменяются, когда вы вносите изменения в свою модель.
Сгенерируйте код, который обменивается данными более эффективно (для примера, с помощью указателей и аргументов pass-by-reference для нескалярных данных).
Для генерации кода примеры показывают, как настроить интерфейс вывода для модели rtwdemo_configinterface
. Можно сконфигурировать отображения кода с помощью Code Mappings editor или отображений кода API (coder.mapping.api.CodeMapping
).
По умолчанию выходные порты корневого уровня в модели появляются в сгенерированном коде как поля глобальных данных структуры с именем
. На основе требований к интерфейсам кода решите, настраивать ли генерацию выходных данных. Если вы не конфигурируете индивидуальных настроек, генератор кода определяет, устранять или изменять представление выходов в сгенерированном коде в целях оптимизации. Если вы конфигурируете индивидуальные настройки, решите:model
_ExtY
Настройка ли строения по умолчанию
Если модель включает значительное количество (для примера, более 10) выходных портов корневого уровня, более эффективно настроить выходные порты с настройкой по умолчанию и переопределить эту настройку для особых случаев. Если модель включает несколько портов, которые имеют уникальные требования к источнику, именованию или размещению, рассмотрите настройку портов по отдельности.
Как объявить и обработать выходные данные в сгенерированном интерфейсе
Как отдельные глобальные переменные
Чтобы записать выходные данные в глобальные переменные, определенные во внешнем коде
Для ссылочных выходных портов модели как глобальных переменных (void-void
)
Как вызовы для доступа к функциям. Требуется Embedded Coder®
Как аргументы функции точки входа. Требуется Embedded Coder
Для получения дополнительной информации об этих опциях смотрите Управляющие данные и Интерфейс функции в Сгенерированном коде.
Другие факторы включают в себя вопрос о том, следует ли:
Назовите outports в сгенерированном коде при помощи меток блоков Outport, которые появляются в модели или при помощи уникальных идентификаторов кода.
Включите volatile
type qualifier в определениях и объявлениях глобальных переменных. Требуется Embedded Coder. См. Раздел «Защита глобальных данных с помощью стандартных и энергозависимых классификаторов типов».
Запись данных из определенной области памяти. Требуется Embedded Coder. Смотрите Control Data and Function Placement in Memory путем вставки прагм.
Список требований к интерфейсам списков, релевантных для портов с соответствующими классами памяти и классом памяти свойствами, см. в разделе Выбор Классе памяти для управления представлением данных в Сгенерированном коде.
Требования к интерфейсам вывода, например, к 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
.
Откройте пример модели rtwdemo_configinterface
. Сохраните копию модели в месте с возможностью записи.
Откройте приложение Embedded Coder.
На вкладке C Code выберите Code Interface > Default Code Mappings.
В редакторе Отображения в разделе Inports and Outports выберите Outports категории. Установите класс памяти по умолчанию равным ExportToFile
.
В Property Inspector установите значение файла заголовка на exOutSys.h
и файл определения для exOutSys.c
.
Сохраните модель.
Можно сконфигурировать отдельные выходные порты корневого уровня для генерации кода. Для примера, если модель имеет два выхода корневого уровня, которые имеют уникальные требования к генерации кода, сконфигурируйте выходные порты по отдельности. Или, если вы конфигурируете настройки по умолчанию для outports, сконфигурируйте отдельные outports, чтобы использовать настройки по умолчанию или уникальные настройки.
Если ваша модель соответствует хотя бы одному из следующих критериев, рассмотрите настройку настроек генерации кода для экспорта индивидуально:
Использует несколько выходов, которые имеют уникальные требования.
Использует немного выходов.
Имеет строение по умолчанию для outports, и вам нужно переопределить строение для некоторых определенных outports.
В этом примере показано, как использовать редактор Отображения для применения строения генерации кода по умолчанию для outports в модели rtwdemo_configinterface
. В предыдущем примере класс памяти по умолчанию для выходных портов устанавливается равным ExportToFile
. Требование задает, что outport Out1
запись выходных данных в глобальную переменную, объявленную и определенную в сгенерированных файлах заголовка и определения, доступных для внешнего кода.
В примере также показано, как сконфигурировать идентификатор, который генератор кода использует для присвоения имени выходу в сгенерированном коде. Можно задать идентификаторы генерации кода, для примера для интегрирования, не изменяя проект модели.
Если вы еще не сделали этого, выполните шаги в разделе Настройка настроек генерации кода по умолчанию для Outports корневого уровня.
В редакторе Отображения перейдите на вкладку Outports. Редактор перечисляет имена блоков Outport и элементов шины, которые находятся в модели. Если порт разрешается к объекту сигнала, справа от имени элемента появляется значок разрешения к объекту сигнала. Класс памяти для выходного порта в модели примера установлен на Auto
, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет строение модели по умолчанию. В данном примере строение модели по умолчанию задаёт класс памяти ExportToFile
.
Чтобы избежать оптимизации и заставить генератор кода использовать строение по умолчанию, установите класс памяти равным Model default
.
Чтобы переопределить строение по умолчанию, задайте класс памяти, который удовлетворяет требованиям генерации кода для этого исходящего порта.
Сконфигурируйте генератор кода, чтобы применить настройку класса памяти по умолчанию к выходу Out1
. Выберите строку для вывода. Установите класс памяти равным Model default: ExportToFile
.
Класс памяти для выбранного выходного порта изменяется на Model default: ExportToFile
.
Сконфигурируйте идентификатор кода для исходящего порта так, чтобы имя аргумента интерфейса в сгенерированном коде совпадало с именем интерфейса, используемого внешним кодом. В редакторе Отображения выберите строку для вывода. В Property Inspector задайте значение свойства Identifier output
.
Сохраните модель.
Сгенерируйте и просмотрите код. Для примера в файл rtwdemo_configinterface.c
, найти, где переменная output
используется в функции точки входа шага.
if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; }
Чтобы автоматизировать строение выходных портов корневого уровня для генерации кода, используйте интерфейс программирования для отображений кода. Например, при создании пользовательских библиотек блоков или части тестового окружения приложения используйте интерфейс программирования для автоматизации строения данных.
В этом примере показано, как использовать интерфейс программирования для настройки параметров по умолчанию для выходных портов корневого уровня для rtwdemo_configinterface модели.
Сконфигурируйте код идентификатор для исходящего порта так, чтобы имя глобальной переменной в сгенерированном коде совпадало с именем переменной в интерфейсе внешнего кода.
Откройте пример модели.
open_system('rtwdemo_configinterface')
Создайте объект cm
вызовом функции coder.mapping.api.get
. Объект хранит строение генерации кода для элементов данных и функций в модели rtwdemo_configinterface
.
cm = coder.mapping.api.get('rtwdemo_configinterface');
Сконфигурируйте настройки по умолчанию для выходных портов путем вызова функции 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')
Проверьте свои строения по умолчанию для выходных портов. Выполните три вызова 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'
Примените строение выходного порта по умолчанию для выходного Out1
.
По умолчанию Simulink устанавливает класс памяти для отдельных выходных портов равным Auto
. Когда класс памяти Auto
, генератор кода:
Определяет, следует ли исключить данные из сгенерированного кода в целях оптимизации.
При сохранении данных определяет, как эффективно представлять данные в сгенерированном коде с учетом настроек строения по умолчанию.
Чтобы управлять строением для выхода, вызовите функцию setOutport
.
Выполните вызов для setOutport
который задает:
Объект, возвращенный coder.mapping.api.get
Имя блока вывода Out1
Класс памяти по умолчанию, ранее установленный для исходящего порта при помощи свойства StorageClass
и значение свойства Model default
Свойства Identifier
и значение свойства output
setOutport(cm,'Out1','StorageClass','Model default','Identifier','output');
Проверьте изменения строения путем вызова функции getOutport
. Задайте объект, возвращенный coder.mapping.api.get
, имя блока outport и StorageClass свойств
или Identifier
.
getOutport(cm,'Out1','StorageClass') ans = 'Model default' getOutport(cm,'Out1','Identifier') ans = 'output'
Сохраните модель.
Сгенерируйте и просмотрите код. Для примера в файл 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 |
GetFunction | Outport появляется в сгенерированном коде как вызов к заданному 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 |
SetFunction | Outport появляется в сгенерированном коде как вызов к заданному set функция. | GetSet |
StructName | Имя структуры в сгенерированном коде для вывода. | BitField и Struct |
Редактор отображений кода | coder.mapping.api.CodeMapping