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. „Leerlauf“ ist ein mittlerer Leistungsmodus, in dem der 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-Weck-Sensoren

Nicht-Wake-up-Sensoren sind Sensoren, die den SoC nicht daran hindern, in den Suspend-Modus zu wechseln, und den SoC nicht aufwecken, um Daten zu melden. Insbesondere ist es den Fahrern nicht gestattet, Wake-Locks zu halten. Es liegt in der Verantwortung der Anwendungen, eine teilweise Wecksperre aufrechtzuerhalten, wenn sie bei ausgeschaltetem Bildschirm Ereignisse von Nicht-Wecksensoren empfangen möchten. Während sich der SoC im Suspend-Modus befindet, müssen die Sensoren weiterhin funktionieren und Ereignisse generieren, die in einem Hardware-FIFO abgelegt werden. (Weitere Informationen finden Sie unter Stapelverarbeitung .) Die Ereignisse im FIFO werden an die Anwendungen übermittelt, wenn der SoC aufwacht. 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 der SoC im Suspend-Modus befindet. Eine Ausnahme bildet das neueste Ereignis von jedem On-Change-Sensor: Das letzte Ereignis muss außerhalb des FIFO gespeichert werden , damit es nicht verloren geht.

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

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

Wecksensoren

Im Gegensatz zu Nicht-Wake-up-Sensoren stellen Wake-up-Sensoren sicher, dass ihre Daten unabhängig vom Zustand des SoC geliefert werden. Während der SoC wach ist, verhalten sich die Wake-up-Sensoren wie Nicht-Wake-up-Sensoren. Wenn der SoC schläft, müssen Wecksensoren den SoC aufwecken, um Ereignisse zu übermitteln. 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 den SoC aufwecken und die Ereignisse übermitteln, bevor die maximale Berichtslatenz abgelaufen ist oder der Hardware-FIFO voll wird. Weitere Einzelheiten finden Sie unter Batchverarbeitung .

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, eine „Timeout-Wake-Sperre“ für 200 Millisekunden aufrechterhalten. Das heißt, der SoC darf in den 200 Millisekunden nach einer Weckunterbrechung nicht wieder in den Ruhezustand wechseln. Diese Anforderung wird in einer zukünftigen Android-Version entfallen und wir benötigen bis dahin diesen Timeout-Wakelock.

Wie definiere ich Wake-Up- und Non-Wake-Up-Sensoren?

Bis zu KitKat wurde die Frage, ob es sich bei einem Sensor um einen Weck- oder einen Nicht-Wecksensor handelte, durch den Sensortyp bestimmt: Bei den meisten handelte es sich um Nicht-Wecksensoren, mit Ausnahme des Näherungssensors und des signifikanten Bewegungsmelders .

Ab L wird durch ein Flag in der Sensordefinition angegeben, ob ein bestimmter Sensor ein Wecksensor ist oder nicht. Die meisten Sensoren können durch Paare von Wakeup- und Nicht-Wakeup-Varianten desselben Sensors definiert werden. In diesem Fall müssen sie sich wie zwei unabhängige Sensoren verhalten und dürfen nicht miteinander interagieren. Weitere Einzelheiten finden Sie unter Interaktion .

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