Этот пример показывает, как моделировать и сгенерировать код для модели, которая инициировала асинхронные события в примере RTOS (VxWorks®), который передается как вход модели, на которую ссылаются.
Откройте модель rtwdemo_async_mdlreftop
в качестве примера.
Модель моделирует источник прерывания и включает блок Async Interrupt и модель, на которую ссылаются. Блок Async Interrupt создает две процедуры обработки прерывания Еврокарты модуля Versa (VME) (ISRs), которые передают сигналы прерывания блокам 1 и 2 Inport модели, на которую ссылаются. Можно поместить блок Async Interrupt между моделируемым источником прерывания и одним из следующего:
Подсистема вызова функции
Блок Task Sync
График Stateflow®, сконфигурированный для вызова функции, ввел событие
Модель, на которую ссылаются, с блоком Inport, который соединяется с одним из предыдущих элементов модели
В этой модели в качестве примера блок Async Interrupt передает асинхронные события (триггерные сигналы вызова функции), Interrupt1
и Interrupt2
, к модели, на которую ссылаются, через блоки 1 и 2 Inport.
Код, сгенерированный для блока Async Interrupt, адаптируется для операционной системы реального времени в качестве примера (VxWorks). Однако можно изменить блок, чтобы сгенерировать код, характерный для среды выполнения.
Откройте модель, на которую ссылаются.
Модель, на которую ссылаются, включает два блока Inport, которые получают прерывания, каждый соединенный с блоком Asynchronous Task Specification, подсистемы вызова функций Count
и Algorithm
и блоки Перехода Уровня. Блок Asynchronous Task Specification, в сочетании с блоком Inport корневого уровня, позволяет эталонной модели получать асинхронный вход вызова функции. Использовать блок:
Соедините блок Asynchronous Task Specification с выходным портом блока Inport корневого уровня, который выводит триггер вызова функции.
Выберите параметр вызова Выходной функции блока Inport, чтобы указать, что это принимает сигналы вызова функции.
На Асинхронном диалоговом окне параметров Спецификации Задачи, устанавливает приоритет задач для асинхронной задачи, сопоставленной с блоком Inport. Задайте целое число или []. Если вы задаете целое число, оно должно совпадать с приоритетом прерывания, инициируемого блоком Async Interrupt в родительской модели. Если вы задаете [], приоритеты не должны соответствовать.
Блок Asynchronous Task Specification для более высокого приоритетного прерывания, interrupt1
, соединяет с подсистемой вызова функций Count
. Count
представляет простую процедуру обработки прерывания (ISR). Второй блок Asynchronous Task Specification соединяет с подсистемой Algorithm
, который включает больше вещества. Это включает несколько блоков и производит два выходных значения. Обе подсистемы выполняются на уровне прерывания.
Для каждого уровня прерывания, заданного для блока Async Interrupt в родительской модели, блок генерирует ISR VME, который выполняет связанную подсистему, блок Task Sync или график.
В топ-модели в качестве примера блок Async Interrupt сконфигурирован для прерываний 1 и 2 VME, использование вектора прерывания смещает 192 и 193. Прерывание 1 соединено проводом, чтобы инициировать подсистему Count
. Прерывание 2 соединено проводом, чтобы инициировать подсистему Algorithm
.
Переход Уровня блокирует передачи данных указателя между портами, которые действуют на различных уровнях. В двух экземплярах блоки защищают передачи данных (препятствуйте тому, чтобы они были вытеснены и повреждены). В другом экземпляре не происходит никакое специальное поведение.
Передачи данных происходят между одной задачей считывания и одной задачей записи.
Операция чтения или операция записи на переменной размера байта являются атомарными.
Когда две задачи взаимодействуют, только один может вытеснить другой.
Для периодических задач задача с более быстрым уровнем имеет более высокий приоритет, чем задача с более медленным уровнем. Задача с более быстрым уровнем вытесняет задачи с более медленными уровнями.
Задачи работают на одном процессоре. Квантование времени не позволено.
Процессы не разрушают и перезапускают, особенно в то время как данные передаются между задачами.
Моделируйте модель. По умолчанию модель сконфигурирована, чтобы отобразить шаги расчета различными цветами. Дискретные шаги расчета для ввода и вывода кажутся красными и зелеными, соответственно. Константы являются пурпурным. Асинхронные прерывания являются фиолетовыми. Блоки Перехода Уровня, которые являются гибридом (шаги расчета ввода и вывода могут отличаться), кажутся желтыми.
Сгенерируйте код и отчет генерации кода для модели. Асинхронный блок Interrupt и сгенерированный код блока Task Sync для примера RTOS (VxWorks). Однако можно изменить блоки, чтобы сгенерировать код для другой среды выполнения.
1. Создайте временную папку для сборки и инспекционного процесса.
2. Создайте модель.
Откройте сгенерированный исходный файл rtwdemo_async_mdlreftop.c
. Код инициализации соединяет и включает ISR isr_num1_vec192
для прерывания 1 и ISR isr_num2_vec193
для прерывания 2.
В сгенерированном исходном файле rtwdemo_async_mdlreftop.c
рассмотрите код для isr_num1_vec192
ISRs и isr_num2_vec293
. Каждый ISR:
Отключает прерывания.
Сохраняет контекст с плавающей точкой.
Вызывает код, сгенерированный для подсистемы, соединенной с блоком модели Inport, на который ссылаются, который получает прерывание.
Восстанавливает контекст с плавающей точкой.
Повторно включает прерывания.
Блок Task Sync генерирует следующий код завершения.
Сгенерируйте процедуры обработки прерывания (Simulink Coder)
Таймеры в асинхронных задачах (Simulink Coder)
Создайте индивидуально настраиваемую асинхронную библиотеку (Simulink Coder)
Импортируйте асинхронные данные о событиях для симуляции (Simulink Coder)
Загрузите данные к входным портам Корневого Уровня (Simulink)
Асинхронные События (Simulink Coder)
Переходы уровня и асинхронные блоки (Simulink Coder)
Асинхронные ограничения поддержки (Simulink Coder)