Suspend-Modus

SoC-Leistungszustände

Die Energiezustände des System-on-a-Chip (SoC) sind: Ein, Leerlauf und Suspend. „Ein“ ist, wenn der SoC läuft. „Idle“ ist ein Modus mit mittlerer Leistung, in dem das SoC mit Strom versorgt wird, aber keine Aufgaben ausführt. „Suspend“ ist ein Energiesparmodus, in dem der SoC nicht mit Strom versorgt wird. Der Stromverbrauch des Geräts ist in diesem Modus normalerweise 100-mal geringer als im „Ein“-Modus.

Nicht-Wecksensoren

Nicht-Aktivierungssensoren sind Sensoren, die das SoC nicht daran hindern, in den Suspend-Modus zu wechseln, und das SoC nicht aufwecken, um Daten zu melden. Insbesondere dürfen die Fahrer keine Wake-Locks halten. Es liegt in der Verantwortung der Anwendungen, eine partielle Wecksperre aufrechtzuerhalten, falls sie Ereignisse von Nicht-Wecksensoren empfangen möchten, während der Bildschirm ausgeschaltet ist. Während sich das SoC im Suspend-Modus befindet, müssen die Sensoren weiter funktionieren und Ereignisse generieren, die in einem Hardware-FIFO abgelegt werden. (Weitere Einzelheiten finden Sie unter Stapelverarbeitung .) Die Ereignisse im FIFO werden an die Anwendungen übermittelt, wenn das SoC reaktiviert wird. Wenn der FIFO zu klein ist, um alle Ereignisse zu speichern, gehen die älteren Ereignisse verloren; die ältesten Daten werden gelöscht, um die neuesten Daten aufzunehmen. Im Extremfall, in dem der FIFO nicht vorhanden ist, gehen alle Ereignisse verloren, die generiert werden, während sich das SoC im Suspend-Modus befindet. Eine Ausnahme ist das letzte Ereignis von jedem Wechselsensor: Das letzte Ereignis muss außerhalb des FIFO gespeichert werden, damit es nicht verloren gehen kann.

Sobald das SoC den Suspend-Modus verlässt, werden alle Ereignisse aus dem FIFO gemeldet und der Betrieb normal fortgesetzt.

Anwendungen, die Nicht-Wake-up-Sensoren verwenden, sollten entweder eine Wecksperre halten, um sicherzustellen, dass das System nicht in den Suspend-Modus wechselt, sich von den Sensoren abmelden, wenn sie sie nicht benötigen, oder damit rechnen, dass Ereignisse verloren gehen, während sich der SoC im Suspend-Modus befindet.

Wecksensoren

Im Gegensatz zu Non-Wake-up-Sensoren sorgen Wake-up-Sensoren dafür, dass ihre Daten unabhängig vom Zustand des SoC geliefert werden. Während das SoC wach ist, verhalten sich die Wecksensoren wie Nicht-Wecksensoren. Wenn das SoC schläft, müssen Aktivierungssensoren das SoC aufwecken, um Ereignisse zu liefern. Sie müssen den SoC weiterhin in den Suspend-Modus versetzen, ihn aber auch aufwecken, wenn ein Ereignis gemeldet werden muss. Das heißt, der Sensor muss das SoC aufwecken und die Ereignisse liefern, bevor die maximale Berichtslatenz verstrichen ist oder das Hardware-FIFO voll wird. Weitere Einzelheiten finden Sie unter Stapelverarbeitung .

Um sicherzustellen, dass die Anwendungen Zeit haben, das Ereignis zu empfangen, bevor der SoC wieder in den Ruhezustand wechselt, muss der Treiber jedes Mal, wenn ein Ereignis gemeldet wird, 200 Millisekunden lang eine „Timeout-Wecksperre“ halten. Das heißt, der SoC sollte in den 200 Millisekunden nach einem Weck-Interrupt nicht wieder in den Ruhezustand wechseln dürfen. Diese Anforderung wird in einer zukünftigen Android-Version verschwinden, und bis dahin benötigen wir diese Timeout-Wakelock.

Wie definiert man Weck- und Nicht-Weck-Sensoren?

Ob ein Sensor ein Weck- oder ein Nicht-Weck-Sensor war, wurde bis zu KitKat durch den Sensortyp bestimmt: Die meisten waren Nicht-Weck-Sensoren, mit Ausnahme des Näherungssensors und des signifikanten Bewegungsmelders .

Beginnend mit L wird durch ein Flag in der Sensordefinition angegeben, ob ein gegebener Sensor ein Wecksensor ist oder nicht. Die meisten Sensoren können durch Paare von Weck- und Nicht-Weck-Varianten desselben Sensors definiert werden, in welchem ​​Fall sie sich wie zwei unabhängige Sensoren verhalten müssen, die nicht miteinander interagieren. Weitere Einzelheiten finden Sie unter Interaktion .

Sofern in der Sensortypdefinition nicht anders angegeben, wird empfohlen, für jeden unter Sensortypen aufgeführten Sensortyp einen Wecksensor und einen Nicht-Wecksensor zu implementieren. Sehen Sie in jeder Sensortypdefinition, welcher Sensor (Wake-up oder Non-Wake-up) von SensorManager.getDefaultSensor(sensorType) zurückgegeben wird. Es ist der Sensor, den die meisten Anwendungen verwenden werden.