Qu’est-ce que le batching ?
Le traitement par lots fait référence à la mise en mémoire tampon des événements de capteur dans un hub de capteurs et/ou un FIFO matériel avant de signaler les événements via le HAL des capteurs . L'emplacement où les événements du capteur sont mis en mémoire tampon (hub de capteur et/ou FIFO matériel) est appelé « FIFO » sur cette page. Lorsque le traitement par lots des événements de capteur n'est pas actif, les événements de capteur sont immédiatement signalés au HAL des capteurs lorsqu'ils sont disponibles.
Le traitement par lots peut permettre des économies d'énergie significatives en réveillant uniquement le processeur d'applications principal (AP), qui exécute Android, lorsque de nombreux événements de capteur sont prêts à être traités, au lieu de le réveiller pour chaque événement individuel. Les économies d'énergie potentielles sont directement corrélées au nombre d'événements que le hub de capteurs et/ou le FIFO peuvent mettre en mémoire tampon : le potentiel d'économie d'énergie est plus important si davantage d'événements peuvent être regroupés. Le traitement par lots exploite l'utilisation d'une mémoire à faible consommation afin de réduire le nombre de réveils de points d'accès à haute puissance.
Le traitement par lots ne peut se produire que lorsqu'un capteur possède un FIFO matériel et/ou peut mettre en mémoire tampon les événements au sein d'un hub de capteurs. Dans les deux cas, le capteur doit signaler le nombre maximum d'événements pouvant être regroupés simultanément via SensorInfo.fifoMaxEventCount
.
Si un capteur dispose d'un espace réservé dans un FIFO, le capteur doit signaler le nombre d'événements réservés via SensorInfo.fifoReservedEventCount
. Si le FIFO est dédié au capteur, alors SensorInfo.fifoReservedEventCount
est la taille du FIFO. Si le FIFO est partagé entre plusieurs capteurs, cette valeur peut être nulle. Un cas d'utilisation courant consiste à permettre à un capteur d'utiliser l'intégralité de la FIFO s'il s'agit du seul capteur actif. Si plusieurs capteurs sont actifs, chaque capteur dispose d'un espace garanti pour au moins les événements SensorInfo.fifoReservedEventCount
dans le FIFO. Si un hub de capteurs est utilisé, la garantie peut être appliquée via un logiciel.
Les événements de capteur sont regroupés dans les situations suivantes :
- La latence maximale actuelle du rapport du capteur est supérieure à zéro, ce qui signifie que les événements du capteur peuvent être retardés jusqu'à la latence maximale du rapport avant d'être signalés via le HAL.
- Le point d'accès est en mode suspension et le capteur est un capteur sans réveil. Dans ce cas, les événements ne doivent pas réveiller l'AP et doivent être stockés jusqu'à ce que l'AP se réveille.
Si un capteur ne prend pas en charge le traitement par lots et que l'AP est en veille, seuls les événements de réveil du capteur sont signalés à l'AP et les événements hors réveil ne doivent pas être signalés à l'AP.
Paramètres de traitement par lots
Les deux paramètres qui régissent le comportement du traitement par lots sont sampling_period_ns et max_report_latency_ns . sampling_period_ns
détermine la fréquence à laquelle un nouvel événement de capteur est généré et max_report_latency_ns
détermine combien de temps avant que l'événement ne soit signalé au HAL des capteurs.
échantillonnage_période_ns
La signification du paramètre sampling_period_ns
dépend du mode de rapport du capteur spécifié :
- Continu :
sampling_period_ns
est le taux d'échantillonnage, c'est-à-dire la fréquence à laquelle les événements sont générés. - En cas de changement :
sampling_period_ns
limite le taux d'échantillonnage des événements, ce qui signifie que les événements ne sont pas générés plus rapidement que toutes les nanosecondessampling_period_ns
. Les périodes peuvent être plus longues quesampling_period_ns
si aucun événement n'est généré et que les valeurs mesurées ne changent pas pendant de longues périodes. Pour plus de détails, voir Mode de reporting en cas de modification . - One-shot :
sampling_period_ns
est ignoré. Cela n’a aucun effet. - Spécial : pour plus de détails sur la façon dont
sampling_period_ns
est utilisé pour les capteurs spéciaux, voir Types de capteurs .
Pour plus d'informations sur l'impact de sampling_period_ns
dans les différents modes, voir Modes de reporting .
Pour les capteurs continus et à changement :
- si
sampling_period_ns
est inférieur àSensorInfo.minDelay
, alors l'implémentation HAL doit le fixer silencieusement àmax(SensorInfo.minDelay, 1ms)
. Android ne prend pas en charge la génération d'événements à plus de 1 000 Hz. - si
sampling_period_ns
est supérieur àSensorInfo.maxDelay
, alors l'implémentation HAL doit le tronquer silencieusement enSensorInfo.maxDelay
.
Les capteurs physiques ont parfois des limites quant à leur vitesse de fonctionnement et à la précision de leurs horloges. Pour tenir compte de cela, la fréquence d'échantillonnage réelle peut différer de la fréquence demandée tant qu'elle satisfait aux exigences du tableau ci-dessous.
Si la fréquence demandée est | Alors la fréquence réelle doit être |
---|---|
en dessous de la fréquence minimale (<1/maxDelay) | entre 90% et 110% de la fréquence min |
entre fréquence min et max | entre 90% et 220% de la fréquence demandée |
au-dessus de la fréquence maximale (> 1/minDelay) | entre 90% et 110% de la fréquence maximale, et en dessous de 1100 Hz |
max_report_latency_ns
max_report_latency_ns
définit le temps maximum en nanosecondes pendant lequel les événements peuvent être retardés et stockés dans la FIFO matérielle avant d'être signalés via le HAL pendant que le point d'accès est réveillé.
Une valeur de zéro signifie que les événements doivent être signalés dès qu'ils sont mesurés, soit en sautant complètement le FIFO, soit en vidant le FIFO dès qu'un événement du capteur est présent.
Par exemple, un accéléromètre activé à 50 Hz avec max_report_latency_ns=0
déclenchera des interruptions 50 fois par seconde lorsque l'AP est réveillé.
Lorsque max_report_latency_ns>0
, les événements de capteur n'ont pas besoin d'être signalés dès qu'ils sont détectés. Ils peuvent être temporairement stockés dans le FIFO et signalés par lots, à condition qu'aucun événement ne soit retardé de plus de max_report_latency_ns
nanosecondes. Cela signifie que tous les événements depuis le lot précédent sont enregistrés et renvoyés en même temps. Cela réduit le nombre d'interruptions envoyées au point d'accès et permet à ce dernier de passer à un mode de consommation inférieure (inactif) pendant que le capteur capture et regroupe les données.
Chaque événement est associé à un horodatage. Le retardement de l'heure à laquelle un événement est signalé n'a pas d'impact sur l'horodatage de l'événement. L'horodatage doit être précis et correspondre à l'heure à laquelle l'événement s'est produit physiquement, et non à l'heure à laquelle il a été signalé.
Autoriser le stockage temporaire des événements de capteur dans le FIFO ne modifie pas le comportement de soumission des événements au HAL ; les événements provenant de différents capteurs peuvent être entrelacés et tous les événements du même capteur sont classés dans le temps.
Événements de réveil et hors réveil
Les événements de capteur provenant des capteurs de réveil doivent être stockés dans une ou plusieurs FIFO de réveil. Une conception courante consiste à disposer d'un seul grand FIFO de réveil partagé dans lequel les événements de tous les capteurs de réveil sont entrelacés. Alternativement, vous pouvez avoir un FIFO de réveil par capteur ou avoir des FIFO dédiés pour des capteurs de réveil particuliers et un FIFO partagé pour le reste des capteurs de réveil.
De même, les événements de capteur provenant de capteurs sans réveil doivent être stockés dans un ou plusieurs FIFO sans réveil.
Dans tous les cas, les événements de capteur de réveil et les événements de capteur de non-réveil ne peuvent pas être entrelacés dans la même FIFO. Les événements de réveil doivent être stockés dans une FIFO de réveil, et les événements de non-réveil doivent être stockés dans une FIFO de non-réveil.
Pour le FIFO de réveil, la conception FIFO unique, grande et partagée offre les meilleurs avantages en termes de puissance. Pour le FIFO sans réveil, les conceptions de FIFO unique et grand partagé et de plusieurs petits FIFO réservés ont des caractéristiques de puissance similaires. Pour plus de suggestions sur la façon de configurer chaque FIFO, consultez Priorité d'allocation FIFO .
Comportement en dehors du mode suspension
Lorsque le point d'accès est réveillé (pas en mode suspension), les événements sont stockés temporairement dans les FIFO tant qu'ils ne sont pas retardés de plus de max_report_latency
.
Tant que l'AP n'entre pas en mode suspension, aucun événement ne sera abandonné ou perdu. Si les FIFO internes sont saturés avant l'expiration max_report_latency
, les événements sont signalés à ce stade pour garantir qu'aucun événement n'est perdu.
Si plusieurs capteurs partagent le même FIFO et que le max_report_latency
de l'un d'eux est écoulé, tous les événements du FIFO sont signalés, même si le max_report_latency
des autres capteurs n'est pas encore écoulé. Cela réduit le nombre de fois où des lots d'événements sont signalés. Lorsqu'un événement doit être signalé, tous les événements de tous les capteurs sont signalés.
Par exemple, si les capteurs suivants sont activés :
- accéléromètre groupé avec
max_report_latency
= 20s - gyroscope groupé avec
max_report_latency
= 5s
Les lots d'accéléromètres sont signalés en même temps que les lots de gyroscopes (toutes les 5 secondes), même si l'accéléromètre et le gyroscope ne partagent pas le même FIFO.
Comportement en mode suspension
Le traitement par lots est particulièrement bénéfique pour collecter les données des capteurs en arrière-plan sans garder le point d'accès éveillé. Étant donné que les pilotes de capteur et l'implémentation HAL ne sont pas autorisés à maintenir un wake-lock*, le point d'accès peut passer en mode suspension même pendant la collecte des données du capteur.
Le comportement des capteurs lorsque le point d'accès est suspendu dépend du fait que le capteur est un capteur de réveil. Pour plus de détails, voir Capteurs de réveil .
Lorsqu'un FIFO sans réveil se remplit, il doit s'enrouler et se comporter comme un tampon circulaire, écrasant les événements plus anciens et les nouveaux événements remplaçant les anciens. max_report_latency
n'a aucun impact sur les FIFO sans réveil en mode suspension.
Lorsqu'un FIFO de réveil se remplit, ou lorsque la max_report_latency
de l'un des capteurs de réveil est écoulée, le matériel doit réveiller le point d'accès et signaler les données.
Dans les deux cas (réveil et non réveil), dès que l'AP sort du mode suspension, un batch est produit avec le contenu de toutes les FIFO, même si max_report_latency
de certains capteurs n'est pas encore écoulé. Cela minimise le risque que le point d'accès doive se réveiller peu de temps après son retour en mode suspension et, par conséquent, minimise la consommation d'énergie.
*Une exception notable à laquelle les conducteurs ne sont pas autorisés à détenir un wakelock est lorsqu'un capteur de réveil avec le mode de rapport continu est activé avec max_report_latency
< 1 seconde. Dans ce cas, le conducteur peut maintenir un wakelock car le point d'accès n'a pas le temps de passer en mode suspension, car il serait réveillé par un événement de réveil avant d'atteindre le mode suspension.
Précautions lors du regroupement de capteurs de réveil
Selon l'appareil, cela peut prendre quelques millisecondes pour que le point d'accès sorte complètement du mode suspension et commence à vider le FIFO. Une marge suffisante doit être allouée dans la FIFO pour permettre à l'appareil de sortir du mode suspension sans que la FIFO de réveil ne déborde. Aucun événement ne doit être perdu et le max_report_latency
doit être respecté.
Précautions lors du traitement par lots de capteurs sans réveil lors du changement
Les capteurs en cas de changement génèrent des événements uniquement lorsque la valeur qu'ils mesurent change. Si la valeur mesurée change alors que le point d'accès est en mode suspension, les applications s'attendent à recevoir un événement dès le réveil du point d'accès. Pour cette raison, le traitement par lots des événements de capteur sans réveil lors d'un changement doit être effectué avec soin si le capteur partage sa FIFO avec d'autres capteurs. Le dernier événement généré par chaque capteur en cas de changement doit toujours être enregistré en dehors de la FIFO partagée afin qu'il ne puisse jamais être écrasé par d'autres événements. Lorsque l'AP se réveille, une fois que tous les événements du FIFO ont été signalés, le dernier événement de capteur en cours de changement doit être signalé.
Voici une situation à éviter :
- Une application s'enregistre sur le compteur de pas sans réveil (en cas de changement) et sur l'accéléromètre sans réveil (continu), tous deux partageant le même FIFO.
- L'application reçoit un événement de compteur de pas
step_count=1000 steps
code>. - L'AP va se suspendre.
- L'utilisateur fait 20 pas, ce qui entraîne l'entrelacement des événements du compteur de pas et de l'accéléromètre, le dernier événement du compteur de pas étant
step_count = 1020 steps
. - L'utilisateur ne bouge pas pendant une longue période, ce qui entraîne une accumulation continue d'événements d'accéléromètre dans la FIFO, finissant par écraser chaque événement
step_count
dans la FIFO partagée. - AP se réveille et tous les événements du FIFO sont envoyés à l'application.
- L'application reçoit uniquement les événements de l'accéléromètre et considère que l'utilisateur n'a pas marché.
En enregistrant le dernier événement de compteur de pas en dehors du FIFO, le HAL peut signaler cet événement lorsque l'AP se réveille, même si tous les autres événements de compteur de pas ont été écrasés par des événements d'accéléromètre. De cette façon, l'application reçoit step_count = 1020 steps
lorsque le point d'accès se réveille.
Implémenter le traitement par lots
Pour économiser de l'énergie, le traitement par lots doit être mis en œuvre sans l'aide de l'AP, et celui-ci doit pouvoir se suspendre pendant le traitement par lots.
Si le traitement par lots est effectué dans un concentrateur de capteurs, la consommation électrique de ce dernier doit être minimisée.
La latence maximale du rapport peut être modifiée à tout moment, notamment lorsque le capteur spécifié est déjà activé ; et cela ne devrait pas entraîner la perte d'événements.
Priorité d'allocation FIFO
Sur les plates-formes dans lesquelles la taille du tampon FIFO matériel et/ou du concentrateur de capteurs est limitée, les concepteurs de systèmes peuvent devoir choisir la quantité de FIFO à réserver pour chaque capteur. Pour vous aider dans ce choix, voici une liste d'applications possibles lorsque le batching est mis en œuvre sur les différents capteurs.
Valeur élevée : estimation à l'estime des piétons à faible puissance
Temps de dosage cible : 1 à 10 minutes
Capteurs à lotir :
- Détecteur de pas de réveil
- Vecteur de rotation du jeu de réveil à 5 Hz
- Baromètre de réveil à 5 Hz
- Réveil magnétomètre non calibré à 5 Hz
Le regroupement de ces données permet d'effectuer une estimation à l'estime des piétons tout en laissant le point d'accès se suspendre.
Valeur élevée : activité intermittente/reconnaissance des gestes de puissance moyenne
Temps de traitement cible : 3 secondes
Capteurs à batch : Accéléromètre sans réveil à 50 Hz
Le regroupement de ces données permet de reconnaître périodiquement des activités et des gestes arbitraires sans avoir à garder le point d'accès éveillé pendant la collecte des données.
Valeur moyenne : activité continue/reconnaissance de gestes de puissance moyenne
Temps de dosage cible : 1 à 3 minutes
Capteurs à batch : Accéléromètre de réveil à 50 Hz
Le regroupement de ces données permet de reconnaître en permanence des activités et des gestes arbitraires sans avoir à garder le point d'accès éveillé pendant la collecte des données.
Valeur moyenne-élevée : réduction de la charge d'interruption
Temps de traitement cible : < 1 seconde
Capteurs à batch : tout capteur haute fréquence, généralement sans réveil.
Si le gyroscope est réglé à 240 Hz, même le regroupement de seulement 10 événements gyroscopiques peut réduire le nombre d'interruptions de 240/seconde à 24/seconde.
Valeur moyenne : collecte continue de données à basse fréquence
Temps de dosage cible : 1 à 10 minutes
Capteurs à lotir :
- Baromètre de réveil à 1 Hz
- Capteur d'humidité de réveil à 1 Hz
- Autres capteurs de réveil basse fréquence à des rythmes similaires
Permet de créer des applications de surveillance à faible consommation.
Valeur moyenne-basse : collecte continue de capteurs complets
Temps de dosage cible : 1 à 10 minutes
Capteurs à batch : Tous capteurs de réveil, à hautes fréquences
Permet la collecte complète des données du capteur tout en laissant le point d'accès en mode suspension. Considérez uniquement si l'espace FIFO n'est pas un problème.