Одножильное, многозадачное выполнение платформы модели

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

Периодическая многоскоростная модель, настроенная для многозадачного выполнения

Откройте модель rtwdemo_multirate_multitasking в качестве примера. Модель сконфигурирована, чтобы отобразить шаги расчета, на которые наносят цветную маркировку, с аннотациями. Чтобы видеть их, после открытия модели, обновляют схему путем нажатия Ctrl+D. Чтобы отобразить легенду, нажмите Ctrl+J.

  • Шаги расчета для Inport блокируют In1_1s и In2_2s установлены в 1 и 2 секунды, соответственно.

  • Обеспечить ясное разделение уровней, шагов расчета для подсистем SS1 и SS2 установлены в 1.

  • Блок Rate Transition моделирует явный переход уровня. В качестве альтернативы сообщите, что Simulink, чтобы вставить блоки Перехода Уровня для вас путем выбора параметра конфигурации модели Автоматически обрабатывает переход уровня для передачи данных.

Соответствующие настройки параметра конфигурации модели

  • Введите набор к Fixed-step.

  • Набор решателя к discrete (no continuous states).

  • Обработайте каждый дискретный уровень как отдельную выбранную задачу.

Планирование

Simulink® симулирует основанное на модели на настройке модели. Код, который генерирует эта модель, реализует ту же семантику выполнения. Simulink распространяет и использует шаги расчета блока Inport, чтобы заказать выполнение блока на основе одножильной, многозадачной платформы выполнения.

Для этой модели легенда шага расчета показывает неявную группировку уровня. Красный представляет самый быстрый дискретный уровень. Зеленый представляет второй самый быстрый дискретный уровень. Желтый представляет смесь этих двух уровней.

Сгенерированный код планирует подуровни в модели. В этом примере, уровне для блока Inport In2_2s, зеленый уровень, подуровень. Сгенерированный код правильно передает данные между задачами, которые запускаются на различных уровнях.

Преимущества неявной группировки уровня:

  • Simulink не налагает архитектурные ограничения на модель. Создайте модель, не налагая ограничения программной архитектуры в модели.

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

  • Генератор кода оптимизирует код через уровни на основе многозадачной семантики выполнения.

Simulink осуществляет ограничения передачи данных, чтобы достигнуть пропорционального числу обращений планирования:

  • Передачи данных происходят между одной задачей чтения и одной задачей записи.

  • Когда передачи данных между двумя задачами, только одна задача может вытеснить другую задачу.

  • Для периодических задач задача с более быстрым уровнем имеет более высокий приоритет, чем задача с более медленным уровнем. Кроме того, задача с более быстрым уровнем, вытесняет задачу с более медленным уровнем.

  • Задачи работают на одном процессоре.

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

  • Процессы не разрушают и перезапускают, особенно во время передач данных между задачами.

  • Операции чтения и операции записи на переменных размера байта являются атомарными.

Ваша среда выполнения связывается с внешними устройствами для чтения и записи входа модели. Например, внешние устройства модели при помощи Блоков s-function Simulink. Сгенерируйте код для тех блоков с остальной частью алгоритма.

Сгенерируйте код и отчет

Откройте приложение Embedded Coder. Затем сгенерируйте код и отчет генерации кода. Модель в качестве примера генерирует отчет.

Рассмотрите сгенерированный код

Из отчета генерации кода рассмотрите сгенерированный код.

  • ert_main.c пример основная программа (среда выполнения) для модели. Этот код управляет выполнением типового кодекса путем вызывания функций точки входа rtwdemo_multirate_multitasking_step0 и rtwdemo_multirate_multitasking_step1. Используйте этот файл в качестве начальной точки для кодирования вашей среды выполнения.

  • rtwdemo_multirate_multitasking.c содержит точки входа для кода, который реализует алгоритм модели. Этот файл включает код планирования уровня.

  • rtwdemo_multirate_multitasking.h объявляет структуры данных модели и открытый интерфейс к точкам входа модели и структурам данных.

  • rtwtypes.h задает типы данных, структуры и макросы, которых требует сгенерированный код.

Интерфейс кода

Откройте и рассмотрите Отчет Интерфейса Кода. Используйте информацию в том отчете записать интерфейсный код для вашей среды выполнения:

  1. Включайте сгенерированный заголовочный файл путем добавления направляющего #include rtwdemo_multirate_singletasking.h.

  2. Запишите входные данные в сгенерированный код для блоков модели Inport.

  3. Вызовите сгенерированные функции точки входа.

  4. Считайте данные из сгенерированного кода для блоков модели Outport.

Input port:

  • rtU.In1_1s из типа данных real_T с размерностью 1

  • rtU.In2_2s из типа данных real_T с размерностью 1

Функции точки входа:

  • Функция точки входа инициализации, void rtwdemo_multirate_multitasking_initialize(void). При запуске вызовите эту функцию однажды.

  • Выведите и обновите точку входа (шаг) функция, void rtwdemo_multirate_multitasking_step0(void). Вызывайте эту функцию периодически на самом быстром уровне в модели. Для этой модели вызывайте функцию каждую секунду. Чтобы достигнуть выполнения в реальном времени, присоедините эту функцию к таймеру.

  • Выведите и обновите функцию точки входа, void rtwdemo_multirate_multitasking_step1(void). Вызывайте эту функцию периодически на втором самом быстром уровне в модели. Для этой модели вызывайте функцию каждые две секунды. Чтобы достигнуть выполнения в реальном времени, присоедините эту функцию к таймеру.

Выходные порты:

  • rtY.Out1 из типа данных real_T с размерностью 1

  • rtY.Out2 из типа данных real_T с размерностью 1

Больше о