Tryb wstrzymania

Stany mocy SoC

Stany zasilania systemu na chipie (SoC) to: włączony, bezczynny i wstrzymany. „Włączony” oznacza, że ​​SoC jest uruchomiony. „Bezczynny” to tryb średniej mocy, w którym SoC jest zasilany, ale nie wykonuje żadnych zadań. „Zawieszenie” to tryb niskiego poboru mocy, w którym SoC nie jest zasilany. Pobór mocy urządzenia w tym trybie jest zwykle 100 razy mniejszy niż w trybie „On”.

Czujniki bez wybudzania

Czujniki niewybudzone to czujniki, które nie zapobiegają przejściu SoC w tryb wstrzymania i nie budzą SoC w celu raportowania danych. W szczególności kierowcy nie mogą trzymać wake-locków. Obowiązkiem aplikacji jest utrzymywanie częściowej blokady wybudzania, jeśli chcą otrzymywać zdarzenia z czujników innych niż wybudzanie, gdy ekran jest wyłączony. Gdy SoC jest w trybie wstrzymania, czujniki muszą nadal działać i generować zdarzenia, które są umieszczane w sprzętowym FIFO. (Patrz partiami , aby uzyskać więcej szczegółów.) Zdarzenia w FIFO są dostarczane do aplikacji po wybudzeniu SoC. Jeśli FIFO jest zbyt małe, aby przechowywać wszystkie zdarzenia, starsze zdarzenia są tracone; najstarsze dane są usuwane, aby pomieścić najnowsze dane. W skrajnym przypadku, gdy FIFO nie istnieje, wszystkie zdarzenia wygenerowane, gdy SoC jest w trybie wstrzymania, zostaną utracone. Jedynym wyjątkiem jest ostatnie zdarzenie z każdego czujnika przy zmianie: ostatnie zdarzenie musi być zapisane poza FIFO, aby nie mogło zostać utracone.

Jak tylko SoC wyjdzie z trybu wstrzymania, wszystkie zdarzenia z FIFO są zgłaszane i operacje są wznawiane normalnie.

Aplikacje korzystające z czujników innych niż wybudzanie powinny albo trzymać blokadę wybudzania, aby upewnić się, że system nie przejdzie w stan wstrzymania, nie wyrejestruje się z czujników, gdy ich nie potrzebują, lub spodziewają się utraty zdarzeń, gdy SoC jest w trybie wstrzymania.

Czujniki budzenia

W przeciwieństwie do czujników niewybudzających, czujniki wybudzania zapewniają, że ich dane są dostarczane niezależnie od stanu SoC. Gdy SoC jest wybudzony, czujniki budzenia zachowują się jak czujniki nie budzące. Gdy SoC jest w stanie uśpienia, czujniki budzenia muszą wybudzić SoC, aby dostarczyć zdarzenia. Muszą nadal pozwolić SoC przejść w tryb wstrzymania, ale muszą również go obudzić, gdy zdarzenie musi zostać zgłoszone. Oznacza to, że czujnik musi obudzić SoC i dostarczyć zdarzenia przed upłynięciem maksymalnego opóźnienia raportowania lub zapełnieniem sprzętowego FIFO. Aby uzyskać więcej informacji, zobacz Parting .

Aby zapewnić aplikacjom czas na odebranie zdarzenia, zanim SoC ponownie przejdzie w stan uśpienia, kierowca musi utrzymywać „blokadę wybudzenia limitu czasu” na 200 milisekund za każdym razem, gdy zdarzenie jest zgłaszane. Oznacza to, że SoC nie powinien zostać ponownie uśpiony w ciągu 200 milisekund po przerwaniu budzenia. To wymaganie zniknie w przyszłej wersji Androida i do tego czasu potrzebujemy tej blokady budzenia.

Jak zdefiniować czujniki budzenia i niewybudzania?

Do KitKat to, czy czujnik był czujnikiem przebudzenia, czy też nie było czujnikiem, było podyktowane typem czujnika: większość z nich nie była czujnikami przebudzenia, z wyjątkiem czujnika zbliżeniowego i znaczącego czujnika ruchu .

Począwszy od L, to, czy dany czujnik jest czujnikiem wybudzania, czy nie, jest określone przez flagę w definicji czujnika. Większość czujników można zdefiniować za pomocą par wariantów wybudzania i niewybudzania tego samego czujnika, w którym to przypadku muszą one zachowywać się jak dwa niezależne czujniki, które nie wchodzą ze sobą w interakcje. Zobacz Interakcja , aby uzyskać więcej informacji.

O ile nie określono inaczej w definicji typu czujnika, zaleca się zaimplementowanie jednego czujnika wybudzenia i jednego czujnika bez wybudzenia dla każdego typu czujnika wymienionego w Typy czujników . W każdej definicji typu czujnika zobacz, który czujnik (wybudzony lub nie wybudzony) zostanie zwrócony przez SensorManager.getDefaultSensor(sensorType) . Jest to czujnik, z którego będzie korzystać większość aplikacji.