Функции разбиения в сгенерированном коде

В этом примере показано, как связать подсистемы в модели с именами функции и файлами.

Узнать, как:

  • Задайте функцию и имена файла в сгенерированном коде.

  • Идентифицируйте части сгенерированного кода, необходимые для интегрирования.

  • Сгенерируйте код для атомарных подсистем.

  • Идентифицируйте данные, которые требуются для выполнения сгенерированной функции.

Для получения информации о модели примера и других примерах в этой серии, смотрите Подготовьте модель алгоритма управления для генерации кода C.

Атомарные и виртуальные подсистемы

Модели в примере Prepare a Алгоритм Управления Model for Генерация Кода C и Configure Data Interface в Сгенерированном коде используют виртуальные подсистемы. Виртуальные подсистемы визуально организуют блоки, но не влияют на функциональность модели. Атомарные подсистемы оценивают блоки, включенные в модель, как модуль. С помощью атомарных подсистем можно задать дополнительную информацию о разбиении функций. В модели атомарные подсистемы появляются с жирной границей.

Просмотр изменений в архитектуре модели

Откройте пример модели rtwdemo_PCG_Eval_P3.

Сохраните копию модели в папку с возможностью записи.

В этом примере показано, как заменить виртуальные подсистемы подсистемами вызова функций. Подсистемы вызова функций:

  • Являются атомарными подсистемами

  • Позволяет вам управлять порядком выполнения подсистемы

  • Выполняется, когда запускается сигнал вызова функции

Путем управления порядком выполнения подсистем можно сопоставить модель с существующей системой, которая имеет определенный порядок выполнения.

Рисунок идентифицирует подсистемы вызова функции (1) PI_ctrl_1, PI_ctrl_2, и Pos_Command_Arbitration.

Эта версия модели содержит новую подсистему Execution_Order_Control (2), которая содержит график Stateflow ®, которая моделирует вызывающую функциональность планировщика. Подсистема управляет порядком выполнения подсистем вызова функции через сигналы вызова функции (3). Позже в этом примере вы исследуете, как изменение порядка выполнения может изменить результаты симуляции.

Эта версия модели содержит новые блоки Преобразования Сигналов (4) на выходах ПИ-контроллеров. С помощью этих дополнительных блоков генератор кода может сгенерировать одну входящую функцию для ПИ-контроллеров.

Расположение функции управления и размещение файлов в сгенерированном коде

В Подготовке Модели Алгоритма Управления для Генерации Кода C и Конфигурировании Интерфейса Данных в Сгенерированном Коде генератор кода создает одну model_step функция, которая содержит код алгоритма управления. Однако многие приложения требуют большего уровня контроля за размещением функций в файлах. Изменяя параметры атомарных подсистем, можно задать несколько функций в одной модели.

Рисунок показывает параметры подсистемы для PI_ctrl_1.

Обработайте как атомарный модуль

  • Включает другое подменю. Для атомарных подсистем этот параметр автоматически выбирается и отключается.

Шаг расчета

  • Задает шаг расчета для выполнения. Недоступно для подсистем вызова функций.

Опции упаковки функций

  • Auto -- Определяет, как подсистема появится в сгенерированном коде. Это значение является значением по умолчанию.

  • Inline - Помещает код подсистемы в строку с остальной частью кода модели.

  • Function -- Генерирует код для подсистемы как функции.

  • Reusable function -- Генерирует переиспользуемую (повторно входящую) функцию из подсистемы. Функция передает все входные и выходные данные через формальные параметры. Функция не имеет прямого доступа к глобальным переменным.

Опции имени функции

  • Выбор Function или Reusable function для Function packaging включает опции имени функции.

  • Auto -- Определяет функцию.

  • Use subsystem name -- Основывает функцию на имени подсистемы.

  • User specified - Применяет указанное имя файла.

Опции имени файла

  • Выбор Function или Reusable function для Function packaging включает опции имени файла.

  • Auto -- Помещает определение функции в модуль, сгенерированный для родительской системы, или, если корень модели является родительским элементом, в model.c.

  • Use subsystem name - Генерирует отдельный файл. Имя файла - это имя подсистемы или библиотечного блока.

  • Use function name - Генерирует отдельный файл. Имя файла задается с помощью Имени функции опций.

  • User specified -- Применяет указанное уникальное имя файла.

Функция с отдельными данными

  • Включено, когда для Function packaging задано значение Function. При выборе генератор кода отделяет внутренние данные подсистемы (для примера, сигналы) от данных родительской модели. Подсистема владеет этими отдельными данными.

Сгенерируйте входящий код

Embedded Coder ® поддерживает входящий код. Повторный код является переиспользуемой стандартной программой программирования, которую одновременно могут использовать несколько программ. Повторный код используется в операционных системах и другом системном программном обеспечении, которое использует многопоточность для обработки параллельных событий. Повторный код не поддерживает данные о состоянии, поэтому в функции нет постоянных переменных. Вызывающие программы поддерживают переменные состояния и должны передать данные о состоянии в функцию. Многие пользователи или процессов могут совместно использовать одну копию входящей функции.

Чтобы сгенерировать повторный код, необходимо сначала задать подсистему как переиспользуемую путем конфигурирования параметра подсистемы Function packaging.

В некоторых случаях строение модели препятствует переиспользуемому коду. В таблице перечислены общие вопросы.

Cause                                     Solution
Subsystem output feeds global signal      Add a Signal Conversion block between the 
data                                      subsystem and the global signal.
Generated function receives data          Select Configuration Parameters >
(formal parameters) through pointers      Model Referencing > Pass fixed-size scalar root
                                          inputs by value for code generation.           
Subsystem uses global signal data         Use a port to pass the global data in and out 
in internal algorithm                     of the subsystem.

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

Чтобы задать алгоритмические данные параметра (такие как коэффициент усиления или коэффициент) вне возможностей действия переиспользуемого библиотечного блока или подсистемы, можно применить маску к блоку или подсистеме и создать параметр маски. Затем можно задать другое значение параметров для каждого образца блока или подсистемы. Каждый параметр маски появляется в сгенерированном коде как формальный параметр входящей функции.

В этой версии модели подсистемы PI_ctrl_1 и PI_ctrl_2 маскированы. В каждой маске значения P и I коэффициент усиления задается такими объектами данных, как I_Gain_2 и P_Gain_2.

Сгенерируйте код для атомарной подсистемы

В разделе «Подготовка модели алгоритма управления для генерации кода C и конфигурирование интерфейса данных в Сгенерированном коде» вы генерируете код на корневом уровне модели. Также можно создать определенную подсистему.

Чтобы инициировать сборку подсистемы, используйте контекстное меню. Вы можете выбрать из следующих опций:

  1. Сборка Эта Подсистема: Обрабатывает подсистему как отдельный режим и создает полный набор исходных файлов C и заголовочных файлов. Эта опция не поддерживает подсистем вызова функций.

  2. Сгенерируйте S-функцию: Генерирует код C для подсистемы и создает оболочку S-функции. Затем можно симулировать код в исходной модели. Эта опция не поддерживает подсистем вызова функций.

  3. Экспорты функций: Генерирует Код С без кода планирования, который поставляется с опцией Build This Subsystem. Используйте эту опцию для создания подсистем, которые используют триггеры, такие как подсистемы вызова функций.

Также откройте приложение Embedded Coder, выберите подсистему и на вкладке Код С нажмите Build.

Исследуйте сгенерированный код

Этот пример сравнивает файлы, которые генерируются для полной системной сборки, с файлами, которые генерируются для экспортированных функций. Вы также исследуете, как маскированные данные появляются в коде.

Запустите скрипт сборки для трёх опций. Затем исследуйте сгенерированные файлы, щелкнув гиперссылки.

rtwdemo_PCG_Eval_P3.c

  • Полная сборка: Да, функция шага

  • PI_ctrl_1: Нет

  • Pos_Command_Arbitration: Нет

PI_ctrl_1.c

  • Полная сборка: Нет

  • PI_ctrl_1: Да, функция триггера

  • Pos_Command_Arbitration: Нет

Pos_Command_Arbitration.c

  • Полная сборка: Нет

  • PI_ctrl_1: Нет

  • Pos_Command_Arbitration: Да, Init и функция

PI_Ctrl_Reusable.c

  • Полная сборка: Да

  • PI_ctrl_1: Да

  • Pos_Command_Arbitration: Нет

ert_main.c

  • Полная сборка: Да

  • PI_ctrl_1: Да

  • Pos_Command_Arbitration: Да

eval_data.c

  • Полная сборка: Да (1)

  • PI_ctrl_1: Да (1)

  • Pos_Command_Arbitration: Нет, данные Eval, не используемые в схеме

(1) eval_data.c имеет разное содержимое в полных и экспортных сборках функций. Полная сборка включает все параметры, которые использует модель. Экспорт функций содержит только те переменные, которые использует подсистема.

Маскированные данные в сгенерированном коде

В файл rtwdemo_PCG_Eval_P3.cсайты вызовов входящей функции используют объекты данных P_Gain, I_Gain, P_Gain_2, и I_Gain_2 как аргументы.

Эффект порядка выполнения на результаты симуляции

По умолчанию Simulink ® выполняет подсистемы в следующем порядке:

  1. PI_ctrl_1

  2. PI_ctrl_2

  3. Pos_Command_Arbitration

В данном примере можно задать один из двух альтернативных порядков выполнения. Затем можно использовать тестовую обвязку, чтобы наблюдать эффект порядка выполнения на результаты симуляции. Подсистема Execution_Order_Control имеет два строений, которые управляют порядком выполнения. Чтобы выбрать строение, используйте контекстное меню подсистемы.

Измените порядок выполнения и наблюдайте за результатами.

Результаты симуляции (положение дросселя с течением времени) незначительно варьируются в зависимости от порядка выполнения. Вы можете увидеть различие наиболее четко, когда изменяется запрос дросселя.

Для следующего примера в этой серии смотрите Вызов внешнего кода С из модели и Сгенерированный код.

Похожие темы