Чтобы использовать код, который вы генерируете из модели, вы вызываете сгенерированные функции точки входа, такие как step
и initialize
. Среда вызова и сгенерированные функции обмениваются входными и выходными данными через глобальные переменные или через формальные параметры (аргументы). Эти данные и механизмы обмена составляют интерфейсы функций точки входа. Для получения информации об интерфейсах по умолчанию для повторно используемых и неповторно используемых моделей в сгенерированном коде смотрите, Как Сгенерированный код Обменивается Данными со Средой.
Путем управления интерфейсами, которые появляются в сгенерированном коде, вы можете:
Минимизируйте модификации, которые необходимо сделать к существующему коду.
Сгенерируйте стабильные интерфейсы, которые не изменяются или минимально изменяются, когда вы вносите изменения в модель.
Сгенерируйте код, который обменивается данными более эффективно (например, при помощи указателей и аргументов передачи ссылкой для нескалярных данных).
По умолчанию, для неповторно используемого кода, блоки Inport на корневом уровне модели появляются в сгенерированном коде как поля глобальной переменной структуры. Точно так же блоки Выходного порта появляются в отличной структуре. Для повторно используемого кода, в зависимости от вашей установки для образцового параметра конфигурации Pass root-level I/O генератор кода может также группировать входные и выходные данные в стандартные структуры.
С Embedded Coder® можно управлять этими именами. Смотрите Характеристики Управления Структур данных (Embedded Coder) (Simulink Coder).
Чтобы использовать сгенерированный код, вы пишете код, который вызывает сгенерированные функции точки входа. Например, функции точки входа включают
, model_step
и функции верхнего уровня, сгенерированные из модели экспорта функций. Чтобы управлять именами образцовых функций точки входа, используйте редактор Отображений Кода (требует Embedded Coder) чтобы применить комбинацию этих методов:model_initialize
На вкладке Function Defaults задайте правила именования значения по умолчанию для категорий функций точки входа путем применения функциональных шаблонов настройки в редакторе Отображений Кода. С этим методом правило именования применяется к функциям в категории. Для получения дополнительной информации смотрите, Конфигурируют Генерацию кода По умолчанию для Функций.
На вкладке Entry-Point Functions задайте имена для отдельных функций точки входа или прямым редактированием столбца Function Name или через диалоговое окно настройки, открытое из столбца Function Preview. Имена, что вы задаете значение по умолчанию переопределения называющие правила, заданные функциональными шаблонами настройки. Для получения дополнительной информации смотрите, Настраивают Сгенерированные Интерфейсы Функции C
Когда вы устанавливаете образцовый параметр конфигурации Code interface packaging на Nonreusable function
(значение по умолчанию), сгенерированные функции точки входа не повторно используемы. Как правило, функции обмениваются данными со средой вызова посредством прямого доступа к глобальным переменным.
Чтобы удалить блок от стандартных структур ввода-вывода путем создания отдельной глобальной переменной, примените класс памяти, такой как ExportedGlobal
или ExportToFile
, к сигналу, что блок представляет.
Чтобы задать класс памяти по умолчанию для блоков Inport и различное значение по умолчанию для блоков Выходного порта, используйте редактор Отображений Кода. Когда вы добавляете такие блоки в модель, они получают класс памяти, который вы задаете. Вы не должны конфигурировать каждый отдельный блок.
Для этого метода у вас должен быть Embedded Coder.
Чтобы заменить значение по умолчанию для отдельного блока, примените различный класс памяти при помощи других инструментов, таких как Model Data Editor или Property Inspector. Смотрите Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра (Simulink Coder).
Для примера смотрите Интерфейс Данных проектирования путем Конфигурирования Блоков Inport и Выходного порта (Simulink Coder). Для получения общей информации о классах памяти, смотрите, Выбирают Storage Class for Controlling Data Representation in Generated Code (Simulink Coder).
Если ваш код вызова уже задает глобальную переменную, которую вы хотите, чтобы сгенерированный код использовал в качестве входных данных или использовал, чтобы сохранить выходные данные, можно снова использовать переменную, препятствуя тому, чтобы генератор кода копировал определение. Примените класс памяти к соответствующему блоку Inport или Outport в модели. Выберите класс памяти, который задает импортированный осциллограф данных, такой как ImportedExtern
или ImportFromFile
. Для получения информации о применении классов памяти смотрите, Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра (Simulink Coder) и Применяют Пользовательские Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.
Можно сконфигурировать один блок Inport или Outport, чтобы появиться в сгенерированном коде как пользовательская структура, которая содержит несколько сигналов ввода или вывода. Можно также сконфигурировать блок, чтобы появиться как подструктура структур ввода-вывода по умолчанию или как отдельная переменная структуры.
Сконфигурируйте блок как невиртуальную шину при помощи объекта Simulink.Bus
как тип данных блока. Если ваш внешний код задает тип структуры, рассмотрите использование функции Simulink.importExternalCTypes
, чтобы сгенерировать объект шины.
Чтобы сгенерировать сигнал шины как подструктуру в стандартных структурах ввода-вывода, оставьте класс блочной системы хранения при настройке по умолчанию, Auto
. Если вы имеете Embedded Coder, в редакторе Отображений Кода, на вкладке Data Defaults, устанавливаете класс памяти для категорий Inports и Outports к Default
.
Чтобы сгенерировать сигнал шины как отдельную глобальную переменную структуры, примените класс памяти, такой как ExportedGlobal
или ExportToFile
.
Для получения дополнительной информации о группировке сигналов в пользовательские структуры в сгенерированном коде, смотрите, Организуют Данные в Структуры в Сгенерированном коде.
Если ваш внешний код задает функцию, которая возвращает входные данные для сгенерированного кода или принимает выходные данные, которые производит сгенерированный код, можно сконфигурировать блок Inport или Outport так, чтобы сгенерированный код вызвал функцию вместо того, чтобы получить доступ к глобальной переменной. Примените класс памяти Embedded Coder GetSet
. Для получения дополнительной информации см. Доступ к данным Через Функции с Пользовательским Классом памяти GetSet.
С Embedded Coder можно опционально сконфигурировать образцовый шаг (выполнение) функция, чтобы получить доступ к вводу и выводу корневого уровня через аргументы вместо того, чтобы непосредственно читать и записать в глобальные переменные. Полностью управляйте характеристиками аргумента, такими как имя, порядок и передающий механизм (ссылкой или значением). Этот уровень настройки может помочь интегрировать сгенерированный код с вашим внешним кодом.
Передать вводы и выводы через аргументы, в диалоговом окне интерфейса Configure C Step Function, select Configure arguments for Step function prototype. Каждый блок Inport и Outport на корневом уровне модели появляется в коде в качестве аргумента функции выполнения. Для получения дополнительной информации смотрите, Настраивают Сгенерированные Интерфейсы Функции C.
void-void
)По умолчанию, для неповторно используемой модели, на которую ссылаются, сгенерированный код передает ввод и вывод корневого уровня через аргументы функции. Неповторно используемая модель, на которую ссылаются, - та, в которой вы устанавливаете образцовый параметр конфигурации Total number of instances allowed per top model на One
.
Чтобы передать эти данные через глобальные переменные вместо этого (для интерфейса void-void
), в модели, на которую ссылаются, применяют классы памяти, такие как ExportedGlobal
и ExportToFile
к корневому уровню блоки Outport и Inport.
Чтобы применить класс памяти по умолчанию к таким блокам, используйте Код, Сопоставляющий Редактор, который требует Embedded Coder. С этим методом, когда вы добавляете такие блоки в модель, блоки получают класс памяти по умолчанию, сохраняя интерфейс void-void
. Для получения дополнительной информации смотрите, Конфигурируют Генерацию кода По умолчанию для Данных.
Чтобы заменить класс памяти по умолчанию, примените классы памяти непосредственно к отдельным блокам при помощи Model Data Editor. Смотрите Применяют Классы памяти к Отдельному Сигналу, состоянию и Элементам данных Параметра.
Для примера, который требует Embedded Coder, смотрите, Устанавливают Владение Данных в Системе Компонентов.
Когда вы устанавливаете Code interface packaging на Reusable function
, сгенерированные функции точки входа повторно используемы. Функции обмениваются данными со средой вызова через формальные параметры (аргументы). По умолчанию каждый блок Inport и Outport корневого уровня появляется в сгенерированном коде в качестве отдельного аргумента вместо поля стандартных структур ввода-вывода.
Чтобы сократить количество аргументов, смотрите, Сокращают Количество Аргументов при помощи Структур (Simulink Coder).
Чтобы управлять типами данных аргументов, смотрите Типы данных Управления Аргументов (Simulink Coder).
Некоторые изменения, которые вы вносите в модель, изменяют интерфейсы функции точки входа в сгенерированном коде. Например, если вы меняете имя модели, имена функций могут измениться. Если вы конфигурируете типовой кодекс, чтобы обмениваться данными через аргументы, когда вы добавляете или удаляете блоки Inport или Outport или меняете имена блоков, соответствующие аргументы могут измениться.
Для более легкого обслуживания вашего кода вызова предотвратите изменения в интерфейсах функций точки входа.
Если вы обмениваетесь входными и выходными данными через аргументы, конфигурируете сгенерированный код, чтобы группировать блоки Inport и Outport в структуры вместо того, чтобы позволить каждому блоку появляться в качестве отдельного аргумента (значение по умолчанию). Затем когда вы добавляете или удаляете блоки Inport или Outport или изменяете их свойства, такие как имя и тип данных, поля изменения структур, но функциональные интерфейсы не изменяются. Смотрите Сокращают Количество Аргументов при помощи Структур.
Установите типы данных Inport, и Outport блокируется явным образом вместо того, чтобы использовать наследованную установку типа данных (который эти блоки используют по умолчанию). Наследованные настройки типа данных могут заставить блоки использовать различные типы данных в зависимости от типов данных восходящих и нисходящих сигналов. Для получения дополнительной информации о конфигурировании типов данных, смотрите Типы данных Управляющего сигнала (Simulink).
С Embedded Coder задайте имена функций, которые не зависят от имени модели. Если вы задаете правило именования с функциональным шаблоном настройки, не используйте маркерный $R
в правиле. Смотрите Имена элементов управления Сгенерированных Функций Точки входа (Embedded Coder) (Simulink Coder).
Сокращение количества аргументов функции может улучшить удобочитаемость кода и уменьшать потребление стековой памяти. Чтобы создать аргумент структуры, который может передать несколько частей данных когда-то, используйте эти методы:
Вручную объедините несколько блоков Inport или Outport так, чтобы они появились в сгенерированном коде как поля структуры или подструктура стандартной структуры данных. Сгенерированная функция точки входа или функции принимают адрес структуры в качестве отдельного аргумента или в качестве подструктуры (поле) стандартных структур ввода-вывода.
Замените блоки Inport или Outport на один блок и сконфигурируйте новый блок как невиртуальную шину при помощи объекта Simulink.Bus
как тип данных блока. Если ваш внешний код задает тип структуры, рассмотрите использование функции Simulink.importExternalCTypes
, чтобы сгенерировать объект шины. Смотрите Организуют Данные в Структуры в Сгенерированном коде и Simulink.importExternalCTypes
.
Когда вы генерируете повторно используемый код с Embedded Coder, конфигурируете блоки Inport и Outport, чтобы появиться в агрегированных структурах по умолчанию. Установите образцовый параметр конфигурации Pass root-level I/O as на установку кроме Individual arguments
.
Чтобы группировать блоки Inport и Outport в структуру данных модели реального времени, выберите Part of model data structure
. Генератор кода агрегировал блоки в структуры ввода-вывода по умолчанию, на которые указывает структура данных модели реального времени. Сгенерированная функция точки входа или функции принимают структуру данных модели реального времени как отдельный аргумент. Если вы выбираете эту установку, функция имеет самое маленькое количество аргументов.
Чтобы агрегировать блоки Inport в структуру и блоки Выходного порта в отличную структуру, выберите Structure reference
. Сгенерированная функция точки входа или функции принимают адрес каждой структуры в качестве аргумента. Другой аргумент принимает структуру данных модели реального времени. Если вы выбираете эту установку, вводы и выводы более идентифицируются в функциональных интерфейсах.
С этой установкой, если вы удаляете корневой уровень блоки Inport или блоки Выходного порта корневого уровня, может измениться функциональная подпись. Точно так же подпись может измениться, если вы добавляете блок 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 Coder).
Можно сконфигурировать сгенерированные функции точки входа, чтобы обмениваться данными через аргументы. Для скалярного или аргумента Array, чтобы управлять именем примитивного типа данных, используют объект Simulink.AliasType
или установить тип данных соответствующего блока или сконфигурировать замены типа данных для целой модели. Эти методы требуют Embedded Coder. Для получения дополнительной информации смотрите Имена типов данных Управления в Сгенерированном коде.
По умолчанию генератор кода принимает, что Inport и блоки Outport на корневом уровне модели составляют интерфейс данных модели. Можно продвинуть произвольный сигнал, параметры блоков или состояние блока к интерфейсу так, чтобы другие системы и компоненты могли получить доступ к нему. Смотрите Продвигают Внутренние Данные Интерфейс.