Управляйте данными и интерфейсом функции в сгенерированном коде

Чтобы использовать код, который вы генерируете из модели, вы вызываете сгенерированные функции точки входа, такие как step и initialize. Вызывающее окружение и сгенерированные функции обмениваются входными и выходными данными через глобальные переменные или через формальные параметры (аргументы). Эти данные и механизмы обмена являются интерфейсами функций точки входа. Для получения информации об интерфейсах по умолчанию для вновь входящих и не входящих моделей в сгенерированном коде, см. Раздел «Как сгенерированный код обменивается данными со окружением».

Управляя интерфейсами, которые появляются в сгенерированном коде, можно:

  • Минимизируйте изменения, которые вы должны внести в существующий код.

  • Сгенерируйте стабильные интерфейсы, которые не изменяются или минимально изменяются, когда вы вносите изменения в модель.

  • Сгенерируйте код, который обменивается данными более эффективно (для примера, с помощью указателей и аргументов pass-by-reference для нескалярных данных).

Имена типов управления, имена полей и имена переменных стандартных структур ввода-вывода (Embedded Coder)

По умолчанию для нерецентного кода Inport блоки на корневом уровне модели появляются в сгенерированном коде как поля глобальной структурной переменной. Точно так же блоки Outport появляются в отличной структуре. Для повторного кода, в зависимости от вашей настройки для параметр конфигурации <reservedrangesplaceholder0> модели, генератор кода может также упаковать входные и выходные данные в стандартные структуры.

С Embedded Coder®можно управлять этими именами. Смотрите Имена Типов Управляющих Данных в Сгенерированном Коде (Embedded Coder).

Управляйте именами сгенерированных функций точки входа (Embedded Coder)

Чтобы использовать сгенерированный код, вы записываете код, который вызывает сгенерированные функции точки входа. Для примера функции точки входа включают model_step, model_initialize, и функций верхнего уровня, сгенерированных из модели экспорта функций. Чтобы управлять именами функций точки входа модели, используйте редактор Code Mappings (требует Embedded Coder), чтобы применить комбинацию из этих методов:

  • На вкладке Function Defaults задайте правила именования по умолчанию для категорий функций точки входа путем применения шаблонов индивидуальной настройки функции в редакторе Отображения. С помощью этого метода правило именования применяется к функциям в категории. Для получения дополнительной информации см. «Настройка генерации кода по умолчанию для функций (Embedded Coder)».

  • На вкладке Functions задайте имена для отдельных функций точки входа путем прямого редактирования столбца Function Name или через диалоговое окно строения, открытое из столбца Function Preview. Имена, которые вы задаете, переопределяют правила именования по умолчанию, заданные шаблонами индивидуальной настройки функции. Для получения дополнительной информации смотрите Сконфигурируйте генерацию кода C для функций точки входа модели (Embedded Coder)

Интерфейс управляющих данных для невходящего кода

Когда вы устанавливаете параметр конфигурации модели Code interface packaging равным Nonreusable function (по умолчанию), сгенерированные функции точки входа не являются входящими. Как правило, функции обмениваются данными с вызывающим окружением посредством прямого доступа к глобальным переменным.

Сконфигурируйте Inport или Outport блок как отдельную глобальную переменную

Чтобы удалить блок из стандартных структур ввода-вывода путем создания отдельной глобальной переменной, примените класс памяти, например ExportedGlobal или ExportToFile, сигналу, который представляет блок. Можно настроить класс памяти по умолчанию для категорий элементов данных, таких как блоки Inport. Когда вы добавляете такие блоки к модели, они получают класс памяти, который вы задаете. Для настройки отдельных блоков можно также использовать редактор Отображения. Вы можете сделать это, если модель имеет всего несколько элементы массива данных определенной категории или переопределить настройки строения по умолчанию.

Для получения примера смотрите Проект Data Interface путем настройки блоков Inport и Outport. Общие сведения о конфигурировании данных для генерации кода см. в разделе Строении генерации кода C для элементов интерфейса модели.

Сконфигурируйте сгенерированный код для чтения или записи в глобальные переменные, определяемые внешним кодом

Если ваш вызывающий код уже задает глобальную переменную, которую вы хотите использовать сгенерированный код в качестве входных данных или использовать для хранения выходных данных, можно повторно использовать переменную, препятствуя дублированию определения генератором кода. Применить класс памяти к соответствующему Inport или Outport блоку в модели. Выберите класс памяти, который задает импортированные возможности данных, например ImportedExtern или ImportFromFile. Для получения информации о применении классов памяти смотрите Строение Генерации кода C для Элементов Интерфейса Модели и Организуйте Данные Параметра в Структуру при помощи Класса Struct Storage (Embedded Coder).

Упакуйте несколько входов или выходов в пользовательскую структуру

Можно сконфигурировать один Inport или Outport блок, чтобы он появился в сгенерированном коде как пользовательская структура, которая содержит несколько входных или выходных сигналов. Можно также сконфигурировать блок как подструктуру структур ввода-вывода по умолчанию или как отдельную структурную переменную.

Сконфигурируйте блок как невиртуальную шину при помощи Simulink.Bus объект как тип данных блока. Если внешний код определяет тип структуры, рассмотрите использование Simulink.importExternalCTypes функция для генерации объекта шины.

  • Чтобы сгенерировать сигнал шины как подструктуру в стандартных структурах ввода-вывода, оставьте класс памяти блоков при значении по умолчанию, Auto. Если у вас есть Embedded Coder, в редакторе Code Mappings, на вкладке Data Defaults, установите класс памяти для категорий Inports и Outports равным Default.

  • Чтобы сгенерировать сигнал шины как отдельную переменную глобальной структуры, примените класс памяти, такой как ExportedGlobal или ExportToFile.

Для получения дополнительной информации о группировке сигналов в пользовательские структуры в сгенерированном коде, смотрите Организовать данные в структуры в Сгенерированном коде.

Сконфигурируйте Inport или Outport блок как вызов функции (Embedded Coder)

Если ваш внешний код определяет функцию, которая возвращает входные данные для сгенерированного кода или принимает выходные данные, которые генерирует сгенерированный код, можно сконфигурировать Inport или Outport блок, чтобы сгенерированный код вызывал функцию вместо доступа к глобальной переменной. Примените класс памяти Embedded Coder GetSet. Для получения дополнительной информации смотрите Доступ к данным через функции с классом памяти GetSet (Embedded Coder).

Передайте входы и выходы через аргументы функции (Embedded Coder)

С помощью Embedded Coder можно опционально сконфигурировать функцию model step (execution) для доступа к входным и выходным входам корневого уровня через аргументы вместо прямого чтения и записи в глобальные переменные. Полностью управляйте характеристиками аргумента, такими как имя, порядок и механизм передачи (по ссылке или по значению). Этот уровень строения может помочь интегрировать сгенерированный код с вашим внешним кодом.

Чтобы передать входные и выходные параметры через аргументы, в диалоговом окне Configure C Step Function interface выберите Configure arguments for Step function prototype. Каждый Inport и Outport блок на корневом уровне модели появляется в коде как аргумент функции выполнения. Для получения дополнительной информации смотрите Configure C Code Generation for Model Entry-Point Functions (Embedded Coder).

Сконфигурируйте входы и выходные параметры модели-ссылки как глобальные переменные (void-void)

По умолчанию для не входящей модели-ссылки сгенерированный код пропускает вход и вывод корневого уровня через аргументы функции. Невходящая модель-ссылка является такой, в которой вы устанавливаете параметр конфигурации модели Total number of instances allowed per top model равным One.

Чтобы передать эти данные через глобальные переменные (для void-void interface), в ссылочной модели, применить классы хранения, такие как ExportedGlobal и ExportToFile в блоки Inport и Outport корневого уровня.

Интерфейс управляющих данных для входящего кода

Когда вы задаете 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 (см. «Определение классов памяти, разделов памяти и шаблонов функций для программной архитектуры (Embedded Coder)»). Применить класс памяти можно с помощью редактора Отображения (см. «Настройка генерации кода по умолчанию для данных (Embedded Coder)»).

    Для получения дополнительной информации смотрите Передайте ввод-вывод корневого уровня как (Embedded Coder).

Управляйте типами данных аргументов

Можно сконфигурировать сгенерированные функции точки входа для обмена данными через аргументы. Для скаляра или аргумента массива, чтобы управлять именем примитивного типа данных, используйте Simulink.AliasType объект, чтобы задать тип данных соответствующего блока или сконфигурировать замену типа данных для всей модели. Эти методы требуют Embedded Coder. Для получения дополнительной информации смотрите Имена типов данных управления в Сгенерированном коде (Embedded Coder).

Продвижение элемента данных в интерфейс

По умолчанию генератор кода принимает, что Inport и Outport блоки на корневом уровне модели составляют интерфейс данных модели. Можно продвигать произвольный сигнал, параметры блоков или состояние блока к интерфейсу, чтобы другие системы и компоненты могли получить к нему доступ. См. Раздел «Продвижение внутренних данных к интерфейсу».

Похожие темы