Разверните код встраиваемой системы из моделей Simulink® путем разделения модели в несколько атомарных подсистем, которые вы создаете отдельно.
Откройте модель в качестве примера rtwdemo_explicitinvocation_atomicsubsys. Модель сконфигурирована, чтобы отобразить шаги расчета, на которые наносят цветную маркировку, с аннотациями. Чтобы видеть их, после открытия модели, обновляют схему путем нажатия Ctrl+D. Чтобы отобразить легенду, нажмите Ctrl+J.
Этот разделы модели алгоритм в две атомарных подсистемы: Rate1s
и Rate2s
. Подсистема Rate1s
сконфигурирован с шагом расчета 1 секунды. Подсистема Rate2s
сконфигурирован с шагом расчета 2 секунд.
Введите набор к Fixed-step
.
Набор решателя к discrete (no continuous states)
.
Обработайте каждый дискретный уровень как отдельную очищенную задачу.
Simulink® симулирует модель, основываясь на настройке модели. Simulink распространяет и использует шаги расчета Inport блока, чтобы заказать выполнение блока на основе одножильной, однозадачной платформы выполнения.
В данном примере легенда шага расчета показывает неявную группировку уровня. Красный представляет самую быструю частоту дискретизации. Зеленый представляет вторую самую быструю частоту дискретизации.
На основе пропорционального числу обращений планирования ваш код приложения (среда выполнения) должен передать данные между подсистемами Rate2s
и Rate1s
на частоте 2 секунд с приоритетом 1 секунды. Таким образом, сгенерированная функция передает данные в 1 второй задаче каждое второе время до выполнения кода для подсистемы Rate1s
.
Ваша среда выполнения должна запланировать сгенерированный функциональный код и обработать передачи данных между ними. Это - преимущество для многоскоростных моделей, потому что сгенерированный код не принимает семантику планирования или передачи данных. Однако среда выполнения должна обработать передачи данных явным образом.
Сгенерируйте одну вызываемую функцию для каждой подсистемы без связей между ними. Несколько путей доступны, чтобы сгенерировать код для подсистемы, включая из контекстного меню подсистемы.
Откройте приложение Embedded Coder.
Щелкните правой кнопкой по блоку подсистемы.
Нажмите C/C ++ Code> Build This Subsystem.
Модель в качестве примера генерирует отчет.
Рассмотрите сгенерированный код в Представлении кода или отчете генерации кода.
ert_main.c
пример основная программа (среда выполнения) для подсистемы. Этот код управляет выполнением типового кодекса путем вызывания функции точки входа Rate1s_step
или Rate2s_step
. Используйте этот файл в качестве начальной точки для кодирования вашей среды выполнения.
Rate1s.c
и Rate2s.c
содержите точки входа для кода, который реализует подсистему Rate1s
и Rate2s
, соответственно. Этот файл включает код планирования задач и уровень.
Rate1s.h
и Rate2s.h
объявите структуры данных модели и открытый интерфейс к точкам входа подсистемы и структурам данных.
rtwtypes.h
задает типы данных, структуры и макросы, которых требует сгенерированный код.
Откройте и рассмотрите Отчет Интерфейса Кода. Используйте информацию в том отчете записать интерфейсный код для вашей среды выполнения:
Включайте сгенерированный заголовочный файл путем добавления направляющего #include rtwdemo_explicitinvocation_atomicsusys.h
.
Запишите входные данные в сгенерированный код для Inport блоков модели.
Вызовите сгенерированные функции точки входа.
Считайте данные из сгенерированного кода для блоков модели Outport.
Input port, Rate1s
:
rtU.In1
из типа real_T
с размерностью 1
rtU.In2
из типа real_T
с размерностью 1
Функции точки входа, Rate1s
:
Инициализируйте функцию точки входа, void Rate1s_initialize(void)
. При запуске вызовите эту функцию однажды.
Выведите и обновите точку входа (шаг) функция, void Rate1s_step(void)
. Вызывайте эту функцию периодически каждую секунду.
Функция завершения, void Rate1s_terminate(void)
. Вызовите эту функцию однажды из вашего кода завершения работы.
Выходные порты, Rate1s
:
rtY.Out1
из типа real_T
с размерностью 1
rtY.Out2
из типа real_T
с размерностью 1
Input port, Rate2s
:
rtU.In1
из типа real_T
с размерностью 1
Функции точки входа, Rate2s
:
Инициализируйте функцию точки входа, void Rate2s_initialize(void)
. Вызовите эту функцию однажды при запуске.
Выведите и обновите точку входа (шаг), void Rate2s_step(void)
. Вызывайте эту функцию периодически каждые 2 секунды.
Функция завершения, void Rate2s_terminate(void)
. Вызовите эту функцию однажды из вашего кода завершения работы.
Выходные порты, Rate2s
:
rtY.Out1
из типа real_T
с размерностью 1