Чтобы использовать код, который вы генерируете из модели, вы вызываете сгенерированные функции точки входа. Вызывающее окружение и сгенерированные функции обмениваются входными и выходными данными, для примера, как глобальные переменные или аргументы функции. Блоки 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 для настройки параметров по умолчанию для выходных портов корневого уровня. Укажите, что генератор кода объявляет и задает переменные, чтобы представлять корневые выходные порты в сгенерированных внешних файлах заголовка и определения.
Откройте пример модели rtwdemo_configrpinterface
. Сохраните копию модели в месте с возможностью записи.
Откройте приложение Simulink Coder.
На вкладке C Code выберите Code Interface > Default Code Mappings.
В редакторе Отображения в разделе Inports and Outports выберите Outports категории. Установите класс памяти по умолчанию равным ExportedGlobal
.
Сохраните модель.
Можно сконфигурировать отдельные выходные порты корневого уровня для генерации кода. Для примера, если модель имеет два выхода корневого уровня, которые имеют уникальные требования к генерации кода, сконфигурируйте выходные порты по отдельности. Или, если вы конфигурируете настройки по умолчанию для outports, сконфигурируйте отдельные outports, чтобы использовать настройки по умолчанию или уникальные настройки.
Если ваша модель соответствует хотя бы одному из следующих критериев, рассмотрите настройку настроек генерации кода для экспорта индивидуально:
Использует несколько выходов, которые имеют уникальные требования.
Использует немного выходов.
Имеет строение по умолчанию для outports, и вам нужно переопределить строение для некоторых определенных outports.
В этом примере показано, как использовать редактор Отображения для применения строения генерации кода по умолчанию для outports в модели rtwdemo_configrpinterface
. В предыдущем примере класс памяти по умолчанию для выходных портов устанавливается равным ExportedGlobal
.
В примере также показано, как сконфигурировать идентификатор, который генератор кода использует для присвоения имени выходу в сгенерированном коде. Можно задать идентификаторы генерации кода, для примера для интегрирования, не изменяя проект модели.
Если вы еще не сделали этого, выполните шаги в разделе Настройка настроек генерации кода по умолчанию для Outports корневого уровня.
В редакторе Отображения перейдите на вкладку Outports. Редактор перечисляет имена блоков Outport и элементов шины, которые находятся в модели. Если порт разрешается к объекту сигнала, справа от имени элемента появляется значок разрешения к объекту сигнала. Класс памяти для выходного порта в модели примера установлен на Auto
, что означает, что генератор кода может исключить или изменить представление соответствующего кода в целях оптимизации. Если оптимизация невозможна, генератор кода применяет строение модели по умолчанию. В данном примере строение модели по умолчанию задаёт класс памяти ExpotedGlobal
.
Чтобы избежать оптимизации и заставить генератор кода использовать строение по умолчанию, установите класс памяти равным Model default
.
Чтобы переопределить строение по умолчанию, задайте класс памяти, который удовлетворяет требованиям генерации кода для этого исходящего порта.
Сконфигурируйте генератор кода, чтобы применить настройку класса памяти по умолчанию к выходу Out1
. Выберите строку для вывода. Установите класс памяти равным Model default: ExportedGlobal
.
Класс памяти для выбранного выходного порта изменяется на Model default: ExportedGlobal
.
Сконфигурируйте идентификатор кода для исходящего порта так, чтобы имя аргумента интерфейса в сгенерированном коде совпадало с именем интерфейса, используемого внешним кодом. В редакторе Отображения выберите строку для вывода. В Property Inspector задайте значение свойства Identifier output
.
Сохраните модель.
Сгенерируйте и просмотрите код. Для примера в файл rtwdemo_configrpinterface.c
, найти, где переменная output
используется в функции точки входа шага.
if (mode) { output = (real_T)mp_K1 * dout_Table1; } else { output = dstate_X; }
Чтобы автоматизировать строение выходных портов корневого уровня для генерации кода, используйте интерфейс программирования для отображений кода. Например, при создании пользовательских библиотек блоков или части тестового окружения приложения используйте интерфейс программирования для автоматизации строения данных.
В этом примере показано, как использовать интерфейс программирования для настройки параметров по умолчанию для выходных портов корневого уровня для rtwdemo_configrpinterface модели. Выходной порт корневого уровня записывает выход в отдельную глобальную переменную.
Сконфигурируйте код идентификатор для исходящего порта так, чтобы имя глобальной переменной в сгенерированном коде совпадало с именем переменной в интерфейсе внешнего кода.
Откройте пример модели.
open_system('rtwdemo_configrpinterface')
Создайте объект cm
вызовом функции coder.mapping.api.get
. Объект хранит строение генерации кода для элементов данных в модели rtwdemo_configrpinterface
.
cm = coder.mapping.api.get('rtwdemo_configrpinterface');
Сконфигурируйте настройки по умолчанию для выходных портов путем вызова функции setDataDefault
. Для аргументов задайте эти значения.
Объект, возвращенный coder.mapping.api.get
Outports
для категории по умолчанию
Имя свойства StorageClass
который имеет значение свойства ExportedGlobal
setDataDefault(cm,'Outports','StorageClass','ExportedGlobal')
Проверьте свои строения по умолчанию для выходных портов. Выполните вызов для getDataDefault
который задает объект, возвращенный coder.mapping.api.get
, категория Outports
, и StorageClass
.
getDataDefault(cm,'Outports','StorageClass') ans = 'ExportedGlobal'
Примените строение выходного порта по умолчанию для выходного 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_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 класса памяти, чтобы сконфигурировать имя для переменной, представляющей выходной порт в сгенерированном коде.
Редактор отображений кода | coder.mapping.api.CodeMapping