Was ist Stapeln?
Beim Stapeln werden Sensorereignisse in einem Sensor-Hub und/oder Hardware-FIFO gepuffert, bevor die Ereignisse über den Sensor-HAL gemeldet werden. Der Ort, an dem Sensorereignisse gepuffert werden (Sensor-Hub und/oder Hardware-FIFO), wird auf dieser Seite als „FIFO“ bezeichnet. Wenn die Stapelverarbeitung von Sensorereignissen nicht aktiv ist, werden Sensorereignisse sofort an die Sensor-HAL gemeldet, sofern verfügbar.
Die Stapelverarbeitung kann erhebliche Energieeinsparungen ermöglichen, indem der Hauptanwendungsprozessor (AP), auf dem Android ausgeführt wird, nur dann aktiviert wird, wenn viele Sensorereignisse zur Verarbeitung bereit sind, anstatt ihn für jedes einzelne Ereignis zu aktivieren. Die potenziellen Energieeinsparungen stehen in direktem Zusammenhang mit der Anzahl der Ereignisse, die der Sensor-Hub und/oder FIFO puffern kann: Es besteht ein größeres Potenzial für Energieeinsparungen, wenn mehr Ereignisse gebündelt werden können. Beim Batching wird Speicher mit geringem Stromverbrauch genutzt, um die Anzahl der AP-Weckvorgänge mit hohem Stromverbrauch zu reduzieren.
Die Stapelverarbeitung kann nur erfolgen, wenn ein Sensor über einen Hardware-FIFO verfügt und/oder Ereignisse innerhalb eines Sensor-Hubs puffern kann. In beiden Fällen muss der Sensor über SensorInfo.fifoMaxEventCount
die maximale Anzahl von Ereignissen melden, die gleichzeitig gestapelt werden können.
Wenn für einen Sensor innerhalb eines FIFO Platz reserviert ist, muss der Sensor die Anzahl der reservierten Ereignisse über SensorInfo.fifoReservedEventCount
melden. Wenn der FIFO dem Sensor zugeordnet ist, ist SensorInfo.fifoReservedEventCount
die Größe des FIFO. Wenn der FIFO von mehreren Sensoren gemeinsam genutzt wird, kann dieser Wert Null sein. Ein häufiger Anwendungsfall besteht darin, einem Sensor die Nutzung des gesamten FIFO zu ermöglichen, wenn er der einzige aktive Sensor ist. Wenn mehrere Sensoren aktiv sind, ist jedem Sensor garantiert Platz für mindestens SensorInfo.fifoReservedEventCount
Ereignisse im FIFO. Bei Verwendung eines Sensor-Hubs kann die Garantie durch Software durchgesetzt werden.
Sensorereignisse werden in den folgenden Situationen gestapelt:
- Die aktuelle maximale Berichtslatenz des Sensors ist größer als Null, was bedeutet, dass Sensorereignisse bis zur maximalen Berichtslatenz verzögert werden können, bevor sie über die HAL gemeldet werden.
- Der AP befindet sich im Suspend-Modus und der Sensor ist ein Nicht-Wake-up-Sensor. In diesem Fall dürfen Ereignisse den AP nicht aufwecken und müssen gespeichert werden, bis der AP aufwacht.
Wenn ein Sensor die Stapelverarbeitung nicht unterstützt und der AP im Ruhezustand ist, werden nur Aktivierungssensorereignisse an den AP gemeldet und Nichtaktivierungsereignisse dürfen nicht an den AP gemeldet werden.
Batch-Parameter
Die beiden Parameter, die das Verhalten der Stapelverarbeitung steuern, sind „sampling_period_ns “ und „max_report_latency_ns“ . sampling_period_ns
bestimmt, wie oft ein neues Sensorereignis generiert wird, und max_report_latency_ns
bestimmt, wie lange es dauert, bis das Ereignis an die Sensor-HAL gemeldet werden muss.
probenahme_zeitraum_ns
Was der Parameter sampling_period_ns
“ bedeutet, hängt vom Berichtsmodus des angegebenen Sensors ab:
- Kontinuierlich:
sampling_period_ns
ist die Abtastrate, also die Rate, mit der Ereignisse generiert werden. - Bei Änderung:
sampling_period_ns
begrenzt die Abtastrate von Ereignissen, was bedeutet, dass Ereignisse nicht schneller als allesampling_period_ns
Nanosekunden generiert werden. Perioden können länger alssampling_period_ns
sein, wenn kein Ereignis generiert wird und sich die Messwerte über längere Zeiträume nicht ändern. Weitere Einzelheiten finden Sie im Berichtsmodus bei Änderung . - Einmalig:
sampling_period_ns
wird ignoriert. Es hat keine Wirkung. - Speziell: Einzelheiten zur Verwendung von
sampling_period_ns
für spezielle Sensoren finden Sie unter Sensortypen .
Weitere Informationen zu den Auswirkungen von sampling_period_ns
in den verschiedenen Modi finden Sie unter Berichtsmodi .
Für Dauer- und Wechselsensoren:
- Wenn
sampling_period_ns
kleiner alsSensorInfo.minDelay
ist, muss die HAL-Implementierung es stillschweigend aufmax(SensorInfo.minDelay, 1ms)
beschränken. Android unterstützt die Generierung von Ereignissen mit mehr als 1000 Hz nicht. - Wenn
sampling_period_ns
größer alsSensorInfo.maxDelay
ist, muss die HAL-Implementierung den Wert stillschweigend aufSensorInfo.maxDelay
kürzen.
Physikalische Sensoren haben manchmal Einschränkungen hinsichtlich der Geschwindigkeit, mit der sie laufen können, und der Genauigkeit ihrer Uhren. Um dies zu berücksichtigen, kann die tatsächliche Abtastfrequenz von der angeforderten Frequenz abweichen, sofern sie die Anforderungen in der folgenden Tabelle erfüllt.
Wenn die angeforderte Frequenz ist | Dann muss die tatsächliche Frequenz sein |
---|---|
unter der Mindestfrequenz (<1/maxDelay) | zwischen 90 % und 110 % der Mindestfrequenz |
zwischen minimaler und maximaler Frequenz | zwischen 90 % und 220 % der angeforderten Frequenz |
über der maximalen Frequenz (>1/minVerzögerung) | zwischen 90 % und 110 % der maximalen Frequenz und unter 1100 Hz |
max_report_latency_ns
max_report_latency_ns
legt die maximale Zeit in Nanosekunden fest, um die Ereignisse verzögert und im Hardware-FIFO gespeichert werden können, bevor sie über die HAL gemeldet werden, während der AP aktiv ist.
Ein Wert von Null bedeutet, dass die Ereignisse gemeldet werden müssen, sobald sie gemessen werden, wobei entweder der FIFO ganz übersprungen wird oder der FIFO geleert wird, sobald ein Ereignis vom Sensor vorliegt.
Beispielsweise löst ein bei 50 Hz aktivierter Beschleunigungsmesser mit max_report_latency_ns=0
50 Mal pro Sekunde Interrupts aus, wenn der AP wach ist.
Wenn max_report_latency_ns>0
ist, müssen Sensorereignisse nicht gemeldet werden, sobald sie erkannt werden. Sie können vorübergehend im FIFO gespeichert und stapelweise gemeldet werden, solange kein Ereignis um mehr als max_report_latency_ns
Nanosekunden verzögert wird. Dies bedeutet, dass alle Ereignisse seit der vorherigen Charge aufgezeichnet und auf einmal zurückgegeben werden. Dies reduziert die Anzahl der an den AP gesendeten Interrupts und ermöglicht es dem AP, in einen Modus mit geringerem Stromverbrauch (Leerlauf) zu wechseln, während der Sensor Daten erfasst und stapelt.
Jedem Ereignis ist ein Zeitstempel zugeordnet. Eine Verzögerung der Meldung eines Ereignisses hat keinen Einfluss auf den Zeitstempel des Ereignisses. Der Zeitstempel muss korrekt sein und dem Zeitpunkt entsprechen, zu dem das Ereignis physisch stattgefunden hat, nicht dem Zeitpunkt, zu dem es gemeldet wurde.
Das Zulassen, dass Sensorereignisse vorübergehend im FIFO gespeichert werden, ändert nichts am Verhalten der Übermittlung von Ereignissen an den HAL; Ereignisse von verschiedenen Sensoren können verschachtelt werden und alle Ereignisse von demselben Sensor werden zeitlich geordnet.
Aufwach- und Nicht-Wach-Ereignisse
Sensorereignisse von Wecksensoren müssen in einem oder mehreren Weck-FIFOs gespeichert werden. Ein gängiges Design besteht darin, einen einzigen, großen, gemeinsam genutzten Weck-FIFO zu haben, in dem Ereignisse von allen Wecksensoren verschachtelt werden. Alternativ können Sie einen Weck-FIFO pro Sensor oder dedizierte FIFOs für bestimmte Wecksensoren und einen gemeinsamen FIFO für die übrigen Wecksensoren verwenden.
Ebenso müssen Sensorereignisse von nicht aufweckbaren Sensoren in einem oder mehreren nicht aufweckbaren FIFOs gespeichert werden.
In allen Fällen können Aktivierungssensorereignisse und Nichtaktivierungssensorereignisse nicht im selben FIFO verschachtelt werden. Aufweckereignisse müssen in einem Aufweck-FIFO gespeichert werden, und Nicht-Aufweckereignisse müssen in einem Nicht-Aufweck-FIFO gespeichert werden.
Für den Weck-FIFO bietet das einzelne, große, gemeinsam genutzte FIFO-Design die besten Leistungsvorteile. Für den Nicht-Wake-up-FIFO haben der einzelne große gemeinsam genutzte FIFO und mehrere kleine reservierte FIFOs ähnliche Leistungseigenschaften. Weitere Vorschläge zur Konfiguration der einzelnen FIFOs finden Sie unter FIFO-Zuweisungspriorität .
Verhalten außerhalb des Suspend-Modus
Wenn der AP wach ist (nicht im Suspend-Modus), werden Ereignisse vorübergehend in FIFOs gespeichert, solange sie nicht um mehr als max_report_latency
verzögert werden.
Solange der AP nicht in den Suspend-Modus wechselt, darf kein Ereignis verworfen werden oder verloren gehen. Wenn interne FIFOs voll werden, bevor max_report_latency
abläuft, werden Ereignisse zu diesem Zeitpunkt gemeldet, um sicherzustellen, dass kein Ereignis verloren geht.
Wenn sich mehrere Sensoren denselben FIFO teilen und die max_report_latency
eines von ihnen abläuft, werden alle Ereignisse aus dem FIFO gemeldet, auch wenn die max_report_latency
der anderen Sensoren noch nicht abgelaufen ist. Dadurch wird die Häufigkeit verringert, mit der Ereignisstapel gemeldet werden. Wenn ein Ereignis gemeldet werden muss, werden alle Ereignisse von allen Sensoren gemeldet.
Wenn beispielsweise folgende Sensoren aktiviert sind:
- Beschleunigungsmesser gestapelt mit
max_report_latency
= 20s - Gyroskop gestapelt mit
max_report_latency
= 5s
Die Beschleunigungsmesser-Batches werden gleichzeitig mit den Gyroskop-Batches gemeldet (alle 5 Sekunden), auch wenn der Beschleunigungsmesser und das Gyroskop nicht denselben FIFO verwenden.
Verhalten im Suspend-Modus
Die Stapelverarbeitung ist besonders nützlich, um Sensordaten im Hintergrund zu sammeln, ohne den AP wach zu halten. Da die Sensortreiber und die HAL-Implementierung keinen Wake-Lock* halten dürfen, kann der AP auch während der Erfassung von Sensordaten in den Suspend-Modus wechseln.
Das Verhalten von Sensoren während der AP angehalten ist, hängt davon ab, ob es sich bei dem Sensor um einen Wecksensor handelt. Weitere Einzelheiten finden Sie unter Wecksensoren .
Wenn ein Nicht-Weck-FIFO voll ist, muss er sich wie ein Ringpuffer verhalten und ältere Ereignisse überschreiben, wobei die neuen Ereignisse die alten ersetzen. max_report_latency
hat im Suspend-Modus keine Auswirkungen auf Nicht-Wake-up-FIFOs.
Wenn ein Weck-FIFO voll ist oder die max_report_latency
eines der Wecksensoren abläuft, muss die Hardware den AP aufwecken und die Daten melden.
In beiden Fällen (Wake-Up und Non-Wake-Up) wird, sobald der AP den Suspend-Modus verlässt, ein Batch mit dem Inhalt aller FIFOs erstellt, auch wenn max_report_latency
einiger Sensoren noch nicht abgelaufen ist. Dies minimiert das Risiko, dass der AP kurz nach der Rückkehr in den Suspend-Modus wieder aufwachen muss, und minimiert somit den Stromverbrauch.
*Eine bemerkenswerte Ausnahme, bei der es Fahrern nicht gestattet ist, eine Wecksperre zu halten, ist, wenn ein Wecksensor mit dem kontinuierlichen Meldemodus mit max_report_latency
< 1 Sekunde aktiviert wird. In diesem Fall kann der Treiber eine Wecksperre aufrechterhalten, da der AP keine Zeit hat, in den Suspend-Modus zu wechseln, da er durch ein Weckereignis geweckt würde, bevor er den Suspend-Modus erreicht.
Vorsichtsmaßnahmen beim Stapeln von Wecksensoren
Je nach Gerät kann es einige Millisekunden dauern, bis der AP den Suspend-Modus vollständig verlässt und mit dem Leeren des FIFO beginnt. Im FIFO muss genügend Spielraum zugewiesen werden, damit das Gerät den Suspend-Modus verlassen kann, ohne dass der Aktivierungs-FIFO überläuft. Es dürfen keine Ereignisse verloren gehen und die max_report_latency
muss eingehalten werden.
Vorsichtsmaßnahmen beim Stapeln von Nicht-Wake-up-On-Change-Sensoren
On-Change-Sensoren erzeugen nur dann Ereignisse, wenn sich der von ihnen gemessene Wert ändert. Ändert sich der Messwert, während sich der AP im Suspend-Modus befindet, erwarten Anwendungen den Empfang eines Ereignisses, sobald der AP aufwacht. Aus diesem Grund muss die Stapelverarbeitung von Nicht-Wake-up -Sensorereignissen bei Änderung sorgfältig durchgeführt werden, wenn der Sensor seinen FIFO mit anderen Sensoren teilt. Das letzte von jedem On-Change-Sensor generierte Ereignis muss immer außerhalb des gemeinsam genutzten FIFO gespeichert werden, damit es niemals durch andere Ereignisse überschrieben werden kann. Wenn der AP aufwacht und alle Ereignisse vom FIFO gemeldet wurden, muss das letzte Sensorereignis bei Änderung gemeldet werden.
Hier ist eine Situation, die Sie vermeiden sollten:
- Eine Anwendung registriert sich beim Nicht-Wake-up-Schrittzähler (bei Änderung) und beim Nicht-Wake-up-Beschleunigungsmesser (kontinuierlich), die beide denselben FIFO verwenden.
- Die Anwendung empfängt ein Schrittzählerereignis
step_count=1000 steps
Code>. - Der AP wird suspendiert.
- Der Benutzer geht 20 Schritte, wodurch Schrittzähler- und Beschleunigungsmesserereignisse verschachtelt werden, wobei das letzte Schrittzählerereignis
step_count = 1020 steps
ist. - Der Benutzer bewegt sich längere Zeit nicht, was dazu führt, dass sich Beschleunigungsmesserereignisse weiterhin im FIFO ansammeln und schließlich jedes
step_count
-Ereignis im gemeinsam genutzten FIFO überschreiben. - AP wacht auf und alle Ereignisse vom FIFO werden an die Anwendung gesendet.
- Die Anwendung empfängt nur Beschleunigungsmesserereignisse und geht davon aus, dass der Benutzer nicht gelaufen ist.
Durch das Speichern des letzten Schrittzählerereignisses außerhalb des FIFO kann der HAL dieses Ereignis melden, wenn der AP aufwacht, selbst wenn alle anderen Schrittzählerereignisse durch Beschleunigungsmesserereignisse überschrieben wurden. Auf diese Weise erhält die Anwendung step_count = 1020 steps
wenn der AP aufwacht.
Implementieren Sie die Stapelverarbeitung
Um Strom zu sparen, muss die Stapelverarbeitung ohne die Hilfe des AP erfolgen und der AP muss während der Stapelverarbeitung in den Ruhezustand versetzt werden können.
Wenn die Stapelverarbeitung in einem Sensor-Hub durchgeführt wird, sollte der Stromverbrauch des Sensor-Hubs minimiert werden.
Die maximale Meldelatenz kann jederzeit geändert werden, insbesondere während der angegebene Sensor bereits aktiviert ist; und dies sollte nicht zum Verlust von Ereignissen führen.
FIFO-Zuweisungspriorität
Auf Plattformen, bei denen die Hardware-FIFO- und/oder Sensor-Hub-Puffergröße begrenzt ist, müssen Systementwickler möglicherweise entscheiden, wie viel FIFO für jeden Sensor reserviert werden soll. Um Ihnen bei dieser Auswahl zu helfen, finden Sie hier eine Liste möglicher Anwendungen, wenn die Stapelverarbeitung auf den verschiedenen Sensoren implementiert ist.
Hoher Wert: Koppelnavigation für Fußgänger mit geringem Stromverbrauch
Angestrebte Dosierzeit: 1 bis 10 Minuten
Sensoren zur Charge:
- Weckschrittdetektor
- Weckspiel-Rotationsvektor bei 5 Hz
- Aufwachbarometer mit 5 Hz
- Unkalibriertes Magnetometer mit 5 Hz aufwecken
Die Stapelung dieser Daten ermöglicht die Durchführung einer Koppelnavigation für Fußgänger, während der AP in den Ruhezustand versetzt wird.
Hoher Wert: Intermittierende Aktivitäts-/Gestenerkennung mit mittlerer Leistung
Angestrebte Dosierzeit: 3 Sekunden
Zu stapelnde Sensoren: Nicht-Wake-up-Beschleunigungsmesser mit 50 Hz
Durch die Stapelung dieser Daten können in regelmäßigen Abständen willkürliche Aktivitäten und Gesten erkannt werden, ohne dass der AP während der Datenerfassung wach gehalten werden muss.
Mittlerer Wert: Kontinuierliche Aktivitäts-/Gestenerkennung mit mittlerer Leistung
Angestrebte Dosierzeit: 1 bis 3 Minuten
Zu stapelnde Sensoren: Wake-up-Beschleunigungsmesser mit 50 Hz
Durch die Stapelung dieser Daten können kontinuierlich willkürliche Aktivitäten und Gesten erkannt werden, ohne dass der AP während der Datenerfassung wach gehalten werden muss.
Mittelhoher Wert: Lastreduzierung unterbrechen
Angestrebte Dosierzeit: < 1 Sekunde
Zu stapelnde Sensoren: alle Hochfrequenzsensoren, normalerweise nicht aufweckbar.
Wenn das Gyroskop auf 240 Hz eingestellt ist, kann selbst die Stapelung von nur 10 Gyroskopereignissen die Anzahl der Interrupts von 240/Sekunde auf 24/Sekunde reduzieren.
Mittlerer Wert: Kontinuierliche niederfrequente Datenerfassung
Angestrebte Dosierzeit: 1 bis 10 Minuten
Sensoren zur Charge:
- Aufwachbarometer mit 1 Hz
- Weck-Feuchtigkeitssensor mit 1 Hz
- Andere Niederfrequenz-Wecksensoren mit ähnlichen Raten
Ermöglicht die Erstellung von Überwachungsanwendungen bei geringem Stromverbrauch.
Mittlerer bis niedriger Wert: Kontinuierliche Erfassung aller Sensoren
Angestrebte Dosierzeit: 1 bis 10 Minuten
Zu stapelnde Sensoren: Alle Wecksensoren mit hohen Frequenzen
Ermöglicht die vollständige Erfassung von Sensordaten, während der AP im Ruhemodus bleibt. Ziehen Sie dies nur in Betracht, wenn der FIFO-Speicherplatz kein Problem darstellt.