Разверните код встраиваемой системы из моделей Simulink® путем разделения модели в подсистемы вызова функций, которые вы создаете отдельно.
Откройте модель в качестве примера rtwdemo_explicitinvocation_funccallsubsys. Модель сконфигурирована, чтобы отобразить шаги расчета, на которые наносят цветную маркировку, с аннотациями. Чтобы видеть их, после открытия модели, обновляют схему путем нажатия Ctrl+D. Чтобы отобразить легенду, нажмите Ctrl+J.
Этот разделы модели алгоритм в три подсистемы вызова функций: Rate1s
, Rate2s
, и DataBuffer
. Используйте подсистемы вызова функций, чтобы смоделировать многоскоростные системы явным образом.
Подсистемы Rate1s
и DataBuffer
используйте шаг расчета 1 секунды. Подсистема Rate2s
использует шаг расчета 2 секунд.
Этот проект модели упоминается как моделирование экспорта функций. Simulink ограничивает модель к подсистемам вызова функций на корневом уровне. Ведущий Inport блок задает имя функции.
Введите набор к Fixed-step
.
Набор решателя к discrete (no continuous states)
.
Обработайте каждый дискретный уровень как отдельную выбранную задачу. Simulink применяет многозадачное выполнение, потому что модель использует несколько частот дискретизации.
Simulink® симулирует модель, основываясь на настройке модели. Simulink распространяет и использует шаги расчета Inport блока, чтобы заказать выполнение блока на основе одножильной, многозадачной платформы выполнения.
В легенде шага расчета, красной, идентифицирует самый быстрый дискретный уровень. Пурпурный идентифицирует уровни, наследованные от экспортируемых функций, указывая, что их выполнение находится вне контекста планирования Simulink.
Ваша среда выполнения должна запланировать сгенерированный функциональный код и данные о передаче между функциями.
Ваша среда выполнения должна запланировать сгенерированный функциональный код и передачи данных указателя между функциями. Сгенерированный код прост, и вы управляете порядком выполнения.
Откройте приложение Embedded Coder. Затем сгенерируйте код и отчет генерации кода.
Из отчета генерации кода рассмотрите сгенерированный код.
ert_main.c
пример основная программа (среда выполнения) для модели. Этот код показывает, как вызвать экспортируемые функции. Код также показывает, как инициализировать, выполнитесь и отключите сгенерированный код.
rtwdemo_explicitinvocation_funccallsubsys.c
вызывает функцию инициализации и экспортируемые функции для подсистем Rate1s
, Rate2s
, и DataBuffer
.
rtwdemo_explicitinvocation_funccallsubsys.h
объявляет структуры данных модели и открытый интерфейс к экспортируемым функциям точки входа и структурам данных.
rtwtypes.h
задает типы данных, структуры и макросы, которых требует сгенерированный код.
Откройте и рассмотрите Отчет Интерфейса Кода. Используйте информацию в том отчете записать интерфейсный код для вашей среды выполнения:
Включайте сгенерированные заголовочные файлы путем добавления директив #include Rate1s.h
, #include DataBuffer.h
, и #include Rate2s.h
.
Запишите входные данные в сгенерированный код для Inport блоков модели.
Вызовите сгенерированные функции точки входа.
Считайте данные из сгенерированного кода для блоков модели Outport.
Input port:
rtU.In1_1s
из типа real_T
с размерностью 1
rtU.In2_2s
из типа real_T
с размерностью 1
Функции точки входа:
Инициализируйте функцию точки входа, void rtwdemo_explicitinvocation_funccallsubsys_initialize(void)
. При запуске вызовите эту функцию однажды.
Экспортируемая функция, void CallEvery1s(void)
. Вызовите эту функцию по мере необходимости.
Экспортируемая функция, void CallEvery1s(void)
. Вызовите эту функцию по мере необходимости.
Экспортируемая функция, void CallEvery2sAt1sPriority(void)
. Вызовите эту функцию по мере необходимости.
Выходные порты:
rtY.Out1
из типа real_T
с размерностью 1
rtY.Out2
из типа real_T
с размерностью 1