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

Разверните код встраиваемой системы из моделей 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.

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

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

Сгенерируйте одну вызываемую функцию для каждой подсистемы без связей между ними. Несколько путей доступны, чтобы сгенерировать код для подсистемы, включая из контекстного меню подсистемы.

  1. Откройте приложение Embedded Coder.

  2. Щелкните правой кнопкой по блоку подсистемы.

  3. Нажмите C/C ++ Code> Build This Subsystem.

  4. В коде Сборки для диалогового окна 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.

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

Больше о