indiv дает очень хороший ответ, но он точен лишь частично.
Реальная работа системы немного сложнее.
Планировщик может выполняться как в результате синхронных, так и асинхронных операций.
Синхронные относятся к операциям, которые вызываются кодом в текущей выполняемой задаче. Ярким примером этого может быть получение семафора (semTake).
Если семафор недоступен, выполняемая в данный момент задача будет отложена и больше не будет доступна для выполнения. В этот момент планировщик будет вызван и определит следующую задачу, которая должна быть выполнена, и выполнит переключение контекста.
Асинхронные операции по существу относятся к прерываниям. Прерывания таймера очень хорошо описаны indiv. Однако ряд различных элементов может вызвать выполнение прерывания: сетевой трафик, датчик, последовательные данные и т. д.
Также полезно помнить, что прерывание таймера не обязательно вызывает переключение контекста! Да, произойдет прерывание, и счетчики отложенной задачи и интервала времени будут уменьшены. Однако, если временной интервал не истек или задача с более высоким приоритетом не переходит из состояния ожидания в состояние готовности, то планировщик фактически не будет вызываться, и вы вернетесь к исходной задаче, именно в тот момент, когда выполнение было прервано.
Обратите внимание, что у планировщика нет собственного контекста; это не задача. Это просто код, который выполняется в любом контексте, из которого он вызывается. Либо из контекста прерывания (асинхронно), либо из контекста вызывающей задачи (синхронно).
person
Benoit
schedule
15.02.2011