Как выполняется планировщик VxWorks?

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

запрос: 1. Кто вызывает планировщик? [в VxWorks] 2. Если он вызывается через регулярные промежутки времени - как этот механизм реализовано?

спасибо заранее.

--Эшвин

4 ответов


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

вот:

когда VxWorks запускается, он настраивает ваше оборудование для создания таймера отменаn МС, где n часто 10, но полностью зависит от вашего оборудования. Интервал таймера обычно настраивается vxWorks в ваш пакет поддержки платы (BSP) когда это начинается.

каждый раз, когда таймер запускает прерывание, система начинает выполнение таймера обработчик прерываний. Обработчик прерываний таймера является частью vxWorks, поэтому теперь VxWorks имеет контроль. Первое, что он делает, это сохранить состояние процессора (например, регистры) в блок управления задачами (TCB) текущей задачи.

затем в конечном итоге VxWorks запускает планировщик для определения кто следующий. Чтобы запустить задачу, vxWorks копирует состояние задачи из своего TCB в регистры машины, и после этого задача имеет контроль над процессором.

бонус информация:

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


indiv дает очень хороший ответ, но он только частично точен.
Фактическая работа системы несколько сложнее.

планировщик может быть выполнен как в результате синхронных, так и асинхронных операций.

Synchronous относится к операциям, которые вызваны в результате кода в текущей выполняемой задаче. Ярким примером этого может быть семафор (semTake).
Если семафор недоступен, в настоящее время выполняемая задача будет pend и больше не будет доступна для выполнения. На этом этапе планировщик будет вызван и определить следующую задачу, которая должна выполняться и будет выполнять переключатель контекста.

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

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

обратите внимание, что планировщик делает не иметь собственного контекста; это не задача. Это просто код, который выполняется в любом контексте он вызывается. Либо из контекста прерывания (асинхронный), либо из контекста вызова задачи (синхронный).


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


планировщик также вызывается, если текущая задача завершается или блокируется.