indiv дает очень хороший ответ, но он лишь частично точным.
Фактическая работа системы несколько сложнее.
Планировщик может быть выполнен в результате синхронных или асинхронных операций.
Синхронный относится к операциям, вызванным в результате кода в выполняемой в настоящее время задаче. Примером этого может быть семафор (semTake).
Если семафор недоступен, выполняющаяся в данный момент задача будет отклонена и больше не будет доступна для выполнения. На этом этапе будет вызываться планировщик и определить следующую задачу, которая должна выполняться, и будет выполнять контекстный переключатель.
Асинхронные операции в основном относятся к прерываниям.Таймерные прерывания были очень хорошо описаны indiv. Однако несколько разных элементов могут привести к прерыванию: сетевой трафик, датчик, последовательные данные и т. Д.
Также хорошо помнить, что прерывание таймера не обязательно вызывает контекстный переключатель! Да, произойдет прерывание, и отложенная задача, а счетчики временных интервалов будут уменьшены. Однако, если временной срез не истек, или нет выше переходы приоритетных задач из состояния ожидания в состояние готовности, тогда планировщик фактически не будет вызываться, и вы вернетесь к исходной задаче, в точную точку, где исполнение было прервано.
Обратите внимание, что планировщик не имеет собственного контекста; это не задача. Это просто код, который выполняется в любом контексте, из которого он вызван. Либо из контекста прерывания (асинхронного), либо из контекста вызывающей задачи (синхронно).
Хотя я не знаю VxWorks, в других ОС планировщик обычно вызывается прерыванием по таймеру, поэтому он может переключать задачи, даже если одна задача занята в данный момент. – Rudi