Этот пример показывает модель, разработанную и сконфигурированную для генерации встраиваемой системы, предназначенную для выполнения на одноядерной, однозадачной платформе. Алгоритм приложения захвачен в одной иерархии модели, что позволяет использовать основанное на времени Simulink ® планирование одной задачи для симуляции модели и выполнения сгенерированного кода .
Откройте пример модели rtwdemo_multirate_singletasking. Модель сконфигурирована так, чтобы отображать закодированные в цвете шаги расчета с аннотациями. Чтобы увидеть их, после открытия модели обновите схему нажатием Ctrl + D. Для отображения легенды нажмите Ctrl + J.
Шаги расчета для блоков Inport In1_1s
и In2_2s
устанавливаются равные 1 и 2 секунды, соответственно.
Чтобы обеспечить чистое разбиение скоростей, шаги расчета для подсистем SS1
и SS2
имеют значение 1.
Введите значение Fixed-step
.
Для решателя задано значение discrete (no continuous states)
.
Обработайте каждую дискретную скорость как отдельную задачу, удаленную.
Simulink ® моделирует модель на основе строения модели. Код, сгенерированный из модели, реализует ту же семантику выполнения. Simulink распространяет и использует шаги расчета блоков Inport, чтобы упорядочить выполнение блоков на основе одноядерной, однозадачной платформы выполнения .
Для этой модели легенда шага расчета показывает неявную группировку скоростей. Красный цвет представляет самую быструю дискретную скорость. Green представляет вторую самую быструю дискретную скорость.
Сгенерированный код планирует субрейты в модели. В этом примере скорость для блока Inport In2_2s
, зеленая скорость, является субрейтом. Сгенерированный код правильно передает данные между задачами, выполняемыми с различными скоростями.
Преимущества неявной группировки ставок:
Simulink не накладывает архитектурные ограничения на модель.
Ваша среда выполнения не требует подробных сведений об базовом планировании функций и переносах данных между скоростями. Поэтому требования к интерфейсам модели упрощаются. Среда выполнения использует сгенерированный код интерфейса, чтобы записать вход, вызвать функцию шага модели и считать выход.
Генератор кода оптимизирует код через скорости на основе семантики выполнения с одной задачей.
Ваша среда выполнения может общаться с внешними устройствами для чтения и записи входов модели. Для примера модели внешние устройства с помощью блоков Simulink S-Function. Сгенерируйте код для этих блоков с остальной частью алгоритма.
Откройте приложение Embedded Coder, затем сгенерируйте код и отчет генерации кода. Пример модели генерирует отчет.
Из отчета генерации кода проверьте сгенерированный код.
ert_main.c
является примером основной программы (среды выполнения) для модели. Этот код управляет выполнением кода модели, вызывая функцию точки входа rtwdemo_multirate_singletasking_step
. Используйте этот файл в качестве начальной точки для кодирования среды выполнения.
rtwdemo_multirate_singletasking.c
содержит точки входа для кода, который реализует алгоритм модели. Этот файл включает код планирования скорости.
rtwdemo_multirate_singletasking.h
объявляет структуры данных моделей и открытый интерфейс для точек входа модели и структур данных.
rtwtypes.h
определяет типы данных, структуры и макросы, которые требуются сгенерированному коду.
Откройте и проверьте отчет по интерфейсам кода. Используйте информацию в этом отчете, чтобы записать код интерфейса для вашей среды выполнения:
Включите сгенерированный заголовочный файл путем добавления директивы #include rtwdemo_multirate_singletasking.h
.
Запишите входные данные в сгенерированный код для блоков Inport модели.
Вызовите сгенерированные функции точки входа.
Считайте данные из сгенерированного кода для блоков Outport модели.
Входные порты:
rtU.In1_1s
типа данных real_T
с размерностью 1
rtU.In2_2s
типа данных real_T
с размерностью 1
Функции точки входа:
Инициализация функции точки входа, void rtwdemo_multirate_singletasking_initialize(void)
. При запуске вызовите эту функцию один раз.
Выход и обновление функции точки входа (шага), void rtwdemo_multirate_singletasking_step(void)
. Периодически вызывайте эту функцию с самой быстрой скоростью в модели. Для этой модели вызывайте функцию каждую секунду. Чтобы добиться выполнения в реальном времени, присоедините эту функцию к таймеру.
Выходные порты:
rtY.Out1
типа данных real_T
с размерностью 1
rtY.Out2
типа данных real_T
с размерностью 1