Как VxWorks назначает приоритет нижним частям прерывания?
Предположим, у меня есть две задачи, "A" и "B", с различным приоритетом, выполняемые на VxWorks с поддержкой SMP. И "A", и "B" выдают команду устройству ввода / вывода (например, диску или сетевой карте), и оба блока ожидают результатов. То есть и "A", и "B" блокируются одновременно. Некоторое время спустя устройство ввода-вывода вызывает прерывание и вызывается ISR. Затем ISR отправляет отложенную работу (также называемую "нижней половиной") рабочему заданию. Вопрос: Каков приоритет рабочего задания?
Руководство разработчика драйвера устройства VxWorks немного расплывчато. Похоже, что приоритет рабочего задания установлен априори. Не существует механизмов автоматического наследования, которые увеличивали бы приоритет рабочей задачи на основе приоритетов задач ("A" и "B"), которые заблокированы в ожидании результатов. Это похоже на работу потоковых приоритетов прерываний в PREEMPT_RT Linux. Однако и QNX Neutrino, и LynxOS планируют выполнение рабочего задания с максимальным приоритетом заблокированных задач - напр. приоритет (рабочий) = max_priority(A, B).
Кто-нибудь может уточнить?
1 ответ
Это зависит именно от того, какой механизм использует "отложенная работа ISR".
Если используется семафор /messageQueue/Event, то задача получателя (A или B) будет выполняться с приоритетом, указанным при создании задачи. В этом сценарии прерывание по существу завершено, и задача (A и / или B) готова к выполнению.
Какая бы задача ни имела наивысший приоритет, она получит запуск и выполнение своей работы. Обратите внимание, что задача не имеет доступа к какой-либо информации из контекста прерывания. Если вы используете глобальные структуры (yuk) или передаете данные через очередь сообщений, тогда задача может получить доступ к этим элементам.
Задача сетевого стека (tNetTask) использует этот подход, и семафор сигнализирует tNetTask, когда пакет получен. Когда tNetTask обработал пакет (повторная сборка пакета и т. Д.), Он затем перенаправляется к любой задаче, ожидающей на соответствующем сокете.
Можно отложить работу от ISR до tExcTask (через вызов excJobAdd). Обратите внимание, что при таком подходе excJobAdd получает указатель на функцию и выполняет функцию в контексте tExcTask (который имеет самый высокий приоритет в системе). Это не действует как самостоятельная задача.
Обратите внимание, что некоторые вещи, такие как файловые системы, драйверы SCSI, USB и т. Д., - это гораздо больше, чем простой драйвер с прерываниями. Они включают в себя ряд различных компонентов, что, к сожалению, также увеличивает сложность.