Чтобы использовать код, который вы генерируете из модели, вы вызываете сгенерированные функции точки входа, такие как step
и initialize
. Вызывающее окружение и сгенерированные функции обмениваются входными и выходными данными через глобальные переменные или через формальные параметры (аргументы). Эти данные и механизмы обмена являются интерфейсами функций точки входа. Для получения информации об интерфейсах по умолчанию для вновь входящих и не входящих моделей в сгенерированном коде, см. Раздел «Как сгенерированный код обменивается данными со окружением».
Управляя интерфейсами, которые появляются в сгенерированном коде, можно:
Минимизируйте изменения, которые вы должны внести в существующий код.
Сгенерируйте стабильные интерфейсы, которые не изменяются или минимально изменяются, когда вы вносите изменения в модель.
Сгенерируйте код, который обменивается данными более эффективно (для примера, с помощью указателей и аргументов pass-by-reference для нескалярных данных).
По умолчанию для нерецентного кода Inport блоки на корневом уровне модели появляются в сгенерированном коде как поля глобальной структурной переменной. Точно так же блоки Outport появляются в отличной структуре. Для повторного кода, в зависимости от вашей настройки для параметр конфигурации <reservedrangesplaceholder0> модели, генератор кода может также упаковать входные и выходные данные в стандартные структуры.
С Embedded Coder®можно управлять этими именами. Смотрите Имена Типов Управляющих Данных в Сгенерированном Коде.
Чтобы использовать сгенерированный код, вы записываете код, который вызывает сгенерированные функции точки входа. Для примера функции точки входа включают
, model
_step
, и функций верхнего уровня, сгенерированных из модели экспорта функций. Чтобы управлять именами функций точки входа модели, используйте редактор Code Mappings (требует Embedded Coder), чтобы применить комбинацию из этих методов:model
_initialize
На вкладке Function Defaults задайте правила именования по умолчанию для категорий функций точки входа путем применения шаблонов индивидуальной настройки функции в редакторе Отображения. С помощью этого метода правило именования применяется к функциям в категории. Дополнительные сведения см. в разделе Настройка генерации кода по умолчанию для функций.
На вкладке Functions задайте имена для отдельных функций точки входа путем прямого редактирования столбца Function Name или через диалоговое окно строения, открытое из столбца Function Preview. Имена, которые вы задаете, переопределяют правила именования по умолчанию, заданные шаблонами индивидуальной настройки функции. Для получения дополнительной информации смотрите Сконфигурируйте генерацию кода C для функций точки входа модели
Когда вы устанавливаете параметр конфигурации модели Code interface packaging равным Nonreusable function
(по умолчанию), сгенерированные функции точки входа не являются входящими. Как правило, функции обмениваются данными с вызывающим окружением посредством прямого доступа к глобальным переменным.
Чтобы удалить блок из стандартных структур ввода-вывода путем создания отдельной глобальной переменной, примените класс памяти, например ExportedGlobal
или ExportToFile
, сигналу, который представляет блок. Можно настроить класс памяти по умолчанию для категорий элементов данных, таких как блоки Inport. Когда вы добавляете такие блоки к модели, они получают класс памяти, который вы задаете. Для настройки отдельных блоков можно также использовать редактор Отображения. Вы можете сделать это, если модель имеет всего несколько элементы массива данных определенной категории или переопределить настройки строения по умолчанию.
Для получения примера смотрите Проект Data Interface путем настройки блоков Inport и Outport. Общие сведения о конфигурировании данных для генерации кода см. в разделе Строении генерации кода C для элементов интерфейса модели.
Если ваш вызывающий код уже задает глобальную переменную, которую вы хотите использовать сгенерированный код в качестве входных данных или использовать для хранения выходных данных, можно повторно использовать переменную, препятствуя дублированию определения генератором кода. Применить класс памяти к соответствующему Inport или Outport блоку в модели. Выберите класс памяти, который задает импортированные возможности данных, например ImportedExtern
или ImportFromFile
. Для получения информации о применении классов памяти смотрите Строение Генерации кода C для Элементов интерфейса модели и Организуйте данные параметра в структуру при помощи класса Struct Storage.
Можно сконфигурировать один Inport или Outport блок, чтобы он появился в сгенерированном коде как пользовательская структура, которая содержит несколько входных или выходных сигналов. Можно также сконфигурировать блок как подструктуру структур ввода-вывода по умолчанию или как отдельную структурную переменную.
Сконфигурируйте блок как невиртуальную шину при помощи Simulink.Bus
объект как тип данных блока. Если внешний код определяет тип структуры, рассмотрите использование Simulink.importExternalCTypes
функция для генерации объекта шины.
Чтобы сгенерировать сигнал шины как подструктуру в стандартных структурах ввода-вывода, оставьте класс памяти блоков при значении по умолчанию, Auto
. Если у вас есть Embedded Coder, в редакторе Code Mappings, на вкладке Data Defaults, установите класс памяти для категорий Inports и Outports равным Default
.
Чтобы сгенерировать сигнал шины как отдельную переменную глобальной структуры, примените класс памяти, такой как ExportedGlobal
или ExportToFile
.
Для получения дополнительной информации о группировке сигналов в пользовательские структуры в сгенерированном коде, смотрите Организовать данные в структуры в Сгенерированном коде.
Если ваш внешний код определяет функцию, которая возвращает входные данные для сгенерированного кода или принимает выходные данные, которые генерирует сгенерированный код, можно сконфигурировать Inport или Outport блок, чтобы сгенерированный код вызывал функцию вместо доступа к глобальной переменной. Примените класс памяти Embedded Coder GetSet
. Для получения дополнительной информации смотрите Доступ к данным через функции с класс памяти.
С помощью Embedded Coder можно опционально сконфигурировать функцию model step (execution) для доступа к входным и выходным входам корневого уровня через аргументы вместо прямого чтения и записи в глобальные переменные. Полностью управляйте характеристиками аргумента, такими как имя, порядок и механизм передачи (по ссылке или по значению). Этот уровень строения может помочь интегрировать сгенерированный код с вашим внешним кодом.
Чтобы передать входные и выходные параметры через аргументы, в диалоговом окне Configure C Step Function interface выберите Configure arguments for Step function prototype. Каждый Inport и Outport блок на корневом уровне модели появляется в коде как аргумент функции выполнения. Для получения дополнительной информации смотрите Сконфигурируйте генерацию кода C для функций точки входа модели.
)По умолчанию для не входящей модели-ссылки сгенерированный код пропускает вход и вывод корневого уровня через аргументы функции. Невходящая модель-ссылка является такой, в которой вы устанавливаете параметр конфигурации модели Total number of instances allowed per top model равным One
.
Чтобы передать эти данные через глобальные переменные (для void-void
interface), в ссылочной модели, применить классы хранения, такие как ExportedGlobal
и ExportToFile
в блоки Inport и Outport корневого уровня.
Чтобы применить класс памяти по умолчанию к таким блокам, используйте Редактор соответствия кода. С помощью этого метода, когда вы добавляете такие блоки к модели, блоки получают класс памяти по умолчанию, сохраняя void-void
интерфейс. Дополнительные сведения см. в разделе Настройка генерации кода по умолчанию для данных.
Чтобы переопределить класс памяти по умолчанию, примените классы памяти непосредственно к отдельным блокам с помощью редактора сопоставлений кода. Смотрите Строение Генерации кода C для Элементов Интерфейса Модели.
Для примера, который требует Embedded Coder, смотрите Установить Владение Данными в иерархии модели.
Когда вы задаете Code interface packaging Reusable function
сгенерированные функции точки входа являются входными. Функции обмениваются данными с вызывающим окружением через формальные параметры (аргументы). По умолчанию каждый Inport корневого уровня и Outport блок появляется в сгенерированном коде как отдельный аргумент вместо поля стандартных структур ввода-вывода.
Чтобы уменьшить количество аргументов, см. Раздел «Сокращение количества аргументов при помощи структур».
Для управления типами данных аргументов см. Раздел «Типы управляющих данных аргументов».
Некоторые изменения, которые вы вносите в модель, изменяют интерфейсы функции точки входа в сгенерированном коде. Например, если вы измените имя модели, имена функций могут измениться. Если вы конфигурируете код модели для обмена данными через аргументы, когда вы добавляете или удаляете Inport или Outport блоки или изменяете имена блоков, соответствующие аргументы могут измениться.
Для более легкого обслуживания вашего кода вызова, предотвратите изменения интерфейсов функций точки входа.
Если вы обмениваетесь входными и выходными данными через аргументы, сконфигурируйте сгенерированный код, чтобы упаковать Inport и Outport блоки в структуры вместо того, чтобы позволить каждому блоку появляться как отдельный аргумент (по умолчанию). Затем, когда вы добавляете или удаляете Inport или Outport блоки или изменяете их свойства, такие как имя и тип данных, поля структур изменяются, но интерфейсы функций не изменяются. См. «Сокращение количества аргументов при использовании структур».
Установите типы данных блоков Inport и Outport явно вместо использования параметра унаследованного типа данных (который эти блоки используют по умолчанию). Унаследованные настройки типа данных могут заставить блоки использовать различные типы данных в зависимости от типов данных восходящих и нисходящих сигналов. Для получения дополнительной информации о конфигурировании типов данных см. Раздел «Типы данных сигналов управления».
С помощью Embedded Coder задайте имена функции, которые не зависят от имени модели. Если вы задаете правило именования с шаблоном индивидуальной настройки функции, не используйте лексему $R
в правиле. Смотрите Управляющие имена сгенерированных функций точки входа (Embedded Coder).
Уменьшение количества аргументов функции может улучшить читаемость кода и уменьшить потребление стека памяти. Чтобы создать структурный аргумент, который может передавать несколько частей данных за один раз, используйте следующие методы:
Вручную объедините несколько Inport или Outport блоков, чтобы они появились в сгенерированном коде как поля структуры или подструктуры стандартной структуры данных. Сгенерированная функция точки входа или функции принимают адрес структуры как отдельный аргумент или как подструктуру (поле) стандартных структур ввода-вывода.
Замените Inport или Outport блоки на один блок и сконфигурируйте новый блок как невиртуальную шину с помощью Simulink.Bus
объект как тип данных блока. Если внешний код определяет тип структуры, рассмотрите использование Simulink.importExternalCTypes
функция для генерации объекта шины. См. раздел «Организация данных в структуры» в сгенерированном коде и Simulink.importExternalCTypes
.
Когда вы генерируете входящий код с помощью Embedded Coder, сконфигурируйте Inport и Outport блоки, чтобы они появлялись в агрегированных структурах по умолчанию. Установите параметр конфигурации <reservedrangesplaceholder1> модели в значение, отличное от Individual arguments
.
Чтобы упаковать Inport и Outport блоки в структуру данных модели реального времени, выберите Part of model data structure
. Генератор кода агрегирует блоки в структуры ввода-вывода по умолчанию, на которые указывает структура данных модели реального времени. Сгенерированная функция или функции точки входа принимают структуру данных модели реального времени как один аргумент. Если вы выбираете эту настройку, функция имеет наименьшее количество аргументов.
Чтобы агрегировать Inport блоки в структуру и Outport блоки в отличную структуру, выберите Structure reference
. Сгенерированная функция точки входа или функции принимают адрес каждой структуры как аргумент. Другой аргумент принимает структуру данных модели реального времени. Если вы выбираете эту настройку, входы и выходы более идентифицируются в функциональных интерфейсах.
С помощью этой настройки, если вы удалите блоки Inport корневого уровня или блоки Outport корневого уровня, сигнатура функции может измениться. Точно так же сигнатура может измениться, если вы добавляете Inport корневого уровня или Outport блок к модели, которая не включает такие блоки.
Для получения дополнительной информации о характеристиках структур установите Pass root-level I/O as равным Part of model data structure
. Затем установите класс памяти по умолчанию для блоков Inport и Outport к структурированному классу памяти, которую вы создаете. С помощью этого метода:
Можно создать одну структуру для блоков или создать две отдельные структуры.
Можно управлять именами типов структур.
Структуры появляются как подструктуры структуры данных модели реального времени. Вы должны задать Pass root-level I/O as значение Part of model data structure
.
Создайте класс памяти с помощью словаря Embedded Coder (см. «Определение классов памяти, разделов памяти и шаблонов функций для программной архитектуры»). Применить класс памяти можно с помощью редактора Отображения (см. «Настройка генерации кода по умолчанию для данных»).
Для получения дополнительной информации смотрите Передайте ввод-вывод корневого уровня как.
Можно сконфигурировать сгенерированные функции точки входа для обмена данными через аргументы. Для скаляра или аргумента массива, чтобы управлять именем примитивного типа данных, используйте Simulink.AliasType
объект, чтобы задать тип данных соответствующего блока или сконфигурировать замену типа данных для всей модели. Эти методы требуют Embedded Coder. Для получения дополнительной информации смотрите Имена типов данных управления в Сгенерированном коде.
По умолчанию генератор кода принимает, что Inport и Outport блоки на корневом уровне модели составляют интерфейс данных модели. Можно продвигать произвольный сигнал, параметры блоков или состояние блока к интерфейсу, чтобы другие системы и компоненты могли получить к нему доступ. См. Раздел «Продвижение внутренних данных к интерфейсу».