2010-06-08 5 views
9

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

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

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

--Ashwin

+0

Хотя я не знаю VxWorks, в других ОС планировщик обычно вызывается прерыванием по таймеру, поэтому он может переключать задачи, даже если одна задача занята в данный момент. – Rudi

ответ

12

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

Вот более подробно:

При запуске VxWorks, он настраивает аппаратное обеспечение для генерации таймера interruptкаждых п миллисекунды, где п часто 10, но полностью зависит от вашего оборудования. Интервал таймера обычно устанавливается vxWorks в вашем Board Support Package (BSP) при его запуске.

Каждый раз, когда таймер запускает прерывание, система запускает таймер interrupt handler. Обработчик прерываний таймера является частью vxWorks, поэтому теперь vxWorks имеет контроль. Первое, что он делает, - сохранить состояние CPU (например, регистры) в Task Control Block (TCB) текущей задачи.

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

Информация Bonus:

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

+0

Спасибо за подробный ответ ... – Ashwin

+0

Обратите внимание, что это верно только в том случае, если вы включили планирование циклического планирования (вызывая kernelTimeSlice()), по умолчанию это приоритетное планирование с приоритетом. – nos

+0

@nos: прерывание таймера всегда работает для отслеживания количества отсчетов, таймеров сторожевого таймера и тайм-аутов семафора независимо от политики планирования. Просто случается, что для приоритетного планирования на основе приоритетов планировщик vxWorks не выбирает новую задачу для запуска, если какая-либо операция с таймером не переместила задачу с более высоким приоритетом в готовую очередь. Но справедливая точка. Я всегда хотел уточнить этот ответ, чтобы быть более точным и включать системные вызовы, которые я совершенно забыл упомянуть в то время. – indiv

0

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

0

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

5

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

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

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

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

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

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