Образцовый вызов явной функции с атомарными подсистемами

Разверните код встраиваемой системы из моделей Simulink® путем разделения модели в несколько атомарных подсистем, которые вы создаете отдельно.

Модель атомарной подсистемы

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

Этот образцовые разделы алгоритм в две атомарных подсистемы: Rate1s и Rate2s. Подсистема Rate1s сконфигурирована с шагом расчета 1 секунды. Подсистема Rate2s сконфигурирована с шагом расчета 2 секунд.

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

  • Решатель> набор Типа к Fixed-step.

  • Решатель> набор Решателя к discrete (no continuous states).

  • Решатель> Обработка каждый дискретный уровень как отдельная очищенная задача.

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

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

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

На основе планирования ratemonotonic ваш код приложения (среда выполнения) должен передать данные между подсистемами Rate2s и Rate1s на частоте 2 секунд с приоритетом 1 секунды. Таким образом, сгенерированная функция передает данные в 1 второй задаче каждое второе время до выполнения кода для подсистемы Rate1s.

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

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

Сгенерируйте одну вызываемую функцию для каждой подсистемы без связей между ними. Несколько путей доступны, чтобы сгенерировать код для подсистемы, включая из контекстного меню подсистемы. Например, щелкните правой кнопкой по блоку подсистемы и нажмите C/C ++ Code> Build This Subsystem. В коде Сборки для диалогового окна Subsystem нажмите Build.

Модель в качестве примера генерирует отчет.

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

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

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

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

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

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

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

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

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

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

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

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

Входные порты, 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

Входные порты, 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

Больше о