Режим приостановки

Режимы энергопотребления процессора

У процессора есть три состояния питания: включено, бездействие и приостановлено. "Включено" означает, что система на чипе работает. "Бездействие" – режим среднего энергопотребления, в котором однокристальная система включена, но не выполняет никаких задач. Режим ожидания – это режим с низким энергопотреблением, в котором SoC не получает питание. Энергопотребление устройства в этом режиме обычно в 100 раз меньше, чем в режиме "Включено".

Датчики, не выводящие устройство из спящего режима

Датчики, не выводящие из спящего режима, не препятствуют переходу SoC в спящий режим и не выводят SoC из спящего режима для передачи данных. В частности, драйверам запрещено удерживать блокировку пробуждения. Приложения должны поддерживать частичный запрет блокировки, если они хотят получать события от датчиков, не предназначенных для пробуждения, когда экран выключен. Когда система на чипе находится в режиме ожидания, датчики должны продолжать работать и генерировать события, которые помещаются в аппаратный буфер FIFO. Подробнее о пакетной обработке… События из FIFO доставляются в приложения, когда система на кристалле выходит из спящего режима. Если FIFO слишком мал, чтобы хранить все события, более старые события теряются. В крайнем случае, когда FIFO отсутствует, все события, сгенерированные во время нахождения SoC в режиме ожидания, теряются. Исключение составляют последние события от каждого датчика, срабатывающего при изменении. Они должны сохраняться вне FIFO, чтобы не быть утерянными.

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

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

Датчики пробуждения

В отличие от обычных датчиков, датчики пробуждения обеспечивают доставку данных независимо от состояния SoC. Когда SoC активна, датчики пробуждения работают как обычные датчики. Когда система на кристалле находится в спящем режиме, датчики пробуждения должны выводить ее из этого режима, чтобы передавать события. При этом SoC должен переходить в режим ожидания, но также должен просыпаться, когда нужно сообщить о событии. То есть датчик должен разбудить SoC и передать события до того, как истечет максимальная задержка передачи или заполнится аппаратный FIFO. Подробнее о пакетной обработке…

Чтобы приложения успели получить событие до того, как процессор снова перейдет в спящий режим, драйвер должен удерживать запрет блокировки с тайм-аутом в течение 200 миллисекунд каждый раз, когда сообщается о событии. Это означает, что однокристальная система не должна возвращаться в спящий режим в течение 200 миллисекунд после прерывания. Это требование будет отменено в будущей версии Android, а до тех пор нам нужна блокировка пробуждения по тайм-ауту.

Как определить датчики пробуждения и датчики, которые не пробуждают устройство?

До версии KitKat тип датчика определял, является ли он датчиком пробуждения или нет. Большинство датчиков не были датчиками пробуждения, за исключением датчика расстояния и детектора значительного движения.

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

Если в определении типа датчика не указано иное, рекомендуется реализовать один датчик пробуждения и один датчик без пробуждения для каждого типа датчика, указанного в разделе Типы датчиков. В определении каждого типа датчика указано, какой датчик (пробуждения или обычный) будет возвращен функцией SensorManager.getDefaultSensor(sensorType). Именно этот датчик будет использоваться большинством приложений.