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