Medindo a Potência do Componente

Você pode determinar o consumo de energia de um componente individual comparando a corrente consumida pelo dispositivo quando o componente está no estado desejado (ligado, ativo, pesquisando etc.) e quando o componente está desligado. Meça a corrente instantânea média consumida no dispositivo em uma tensão nominal usando um monitor de energia externo, como uma fonte de alimentação de bancada ou ferramentas especializadas de monitoramento de bateria (como o software Monsoon Solution Inc. Power Monitor e Power Tool).

Os fabricantes geralmente fornecem informações sobre a corrente consumida por um componente individual. Use esta informação se ela representar com precisão a corrente extraída da bateria do dispositivo na prática. No entanto, valide os valores fornecidos pelo fabricante antes de usar esses valores no perfil de energia do dispositivo.

Controlar o consumo de energia

Ao medir, certifique-se de que o dispositivo não tenha uma conexão com uma fonte de carga externa, como uma conexão USB com um host de desenvolvimento usado ao executar o Android Debug Bridge (adb). O dispositivo em teste pode consumir corrente do host, reduzindo assim as medições na bateria. Evite conexões USB On-The-Go (OTG), pois o dispositivo OTG pode consumir corrente do dispositivo em teste.

Excluindo o componente que está sendo medido, o sistema deve funcionar em um nível constante de consumo de energia para evitar medições imprecisas causadas por alterações em outros componentes. As atividades do sistema que podem introduzir alterações indesejadas nas medições de potência incluem:

  • Celular, Wi-Fi e Bluetooth recebem, transmitem ou verificam a atividade . Quando não estiver medindo a energia do rádio celular, defina o dispositivo para o modo avião e ative o Wi-Fi ou o Bluetooth conforme apropriado.
  • Tela ligada/desligada . As cores exibidas enquanto a tela está ligada podem afetar o consumo de energia em algumas tecnologias de tela. Desligue a tela ao medir valores para componentes sem tela.
  • Suspensão/retomada do sistema . Um estado de tela desligada pode desencadear uma suspensão do sistema, colocando partes do dispositivo em um estado de baixa energia ou desligado. Isso pode afetar o consumo de energia do componente que está sendo medido e introduzir grandes variações nas leituras de energia à medida que o sistema retoma periodicamente o envio de alarmes, etc. Para obter detalhes, consulte Controlando a suspensão do sistema .
  • CPUs alterando a velocidade e entrando/sair do estado ocioso do agendador de baixo consumo de energia . Durante a operação normal, o sistema faz ajustes frequentes nas velocidades da CPU, no número de núcleos de CPU online e em outros estados do núcleo do sistema, como velocidade do barramento de memória e voltagens dos trilhos de alimentação associados às CPUs e à memória. Durante o teste, esses ajustes afetam as medições de potência:
    • As operações de dimensionamento de velocidade da CPU podem reduzir a quantidade de dimensionamento de clock e tensão dos barramentos de memória e outros componentes principais do sistema.
    • A atividade de agendamento pode afetar a porcentagem de tempo que as CPUs passam em estados ociosos de baixo consumo de energia. Para obter detalhes sobre como evitar que esses ajustes ocorram durante o teste, consulte Controlando a velocidade da CPU .

Por exemplo, Joe Droid deseja calcular o valor screen.on de um dispositivo. Ele habilita o modo avião no dispositivo, executa o dispositivo em um estado atual estável, mantém a velocidade da CPU constante e usa um wakelock parcial para evitar a suspensão do sistema. Joe então desliga a tela do dispositivo e faz uma medição (200mA). Em seguida, Joe liga a tela do dispositivo com brilho mínimo e faz outra medição (300mA). O valor screen.on é 100mA (300 - 200).

Nota : Para componentes que não têm uma forma de onda plana de consumo de corrente quando ativos (como rádio celular ou Wi-Fi), meça a corrente média ao longo do tempo usando uma ferramenta de monitoramento de energia.

Ao usar uma fonte de alimentação externa no lugar da bateria do dispositivo, o sistema pode apresentar problemas devido a um termistor de bateria desconectado ou pinos de medidor de combustível integrados (ou seja, uma leitura inválida da temperatura da bateria ou da capacidade restante da bateria pode desligar o kernel ou o sistema Android) . Baterias falsas podem fornecer sinais nos pinos do termistor ou medidor de combustível que imitam as leituras de temperatura e estado de carga para um sistema normal e também podem fornecer cabos convenientes para conexão a fontes de alimentação externas. Como alternativa, você pode modificar o sistema para ignorar os dados inválidos da bateria ausente.

Sistema de controle suspenso

Esta seção descreve como evitar o estado de suspensão do sistema quando você não deseja que ele interfira em outras medições e como medir o consumo de energia do estado de suspensão do sistema quando você deseja medi-lo.

Evitando a suspensão do sistema

A suspensão do sistema pode introduzir variações indesejadas nas medições de energia e colocar os componentes do sistema em estados de baixa energia inadequados para medir o uso de energia ativa. Para evitar que o sistema seja suspenso enquanto a tela estiver desligada, use um wakelock parcial temporário. Usando um cabo USB, conecte o dispositivo a um host de desenvolvimento e emita o seguinte comando:

adb shell "echo temporary > /sys/power/wake_lock"

Enquanto estiver em wake_lock , o estado de tela desligada não aciona uma suspensão do sistema. (Lembre-se de desconectar o cabo USB do dispositivo antes de medir o consumo de energia.)

Para remover o wakelock:

adb shell "echo temporary > /sys/power/wake_unlock"

Sistema de medição suspenso

Para medir o consumo de energia durante o estado de suspensão do sistema, meça o valor de cpu.idle no perfil de energia. Antes de medir:

  • Remova os wakelocks existentes (como descrito acima).
  • Coloque o dispositivo no modo avião para evitar atividade simultânea do rádio celular, que pode ser executado em um processador separado das partes do SoC controladas pela suspensão do sistema.
  • Certifique-se de que o sistema esteja em estado de suspensão:
    • A confirmação das leituras atuais se estabiliza em um valor estável. As leituras devem estar dentro da faixa esperada para o consumo de energia do estado de suspensão do SoC mais o consumo de energia dos componentes do sistema que permanecem energizados (como o USB PHY).
    • Verificando a saída do console do sistema.
    • Observando as indicações externas do status do sistema (como um LED desligando quando não está em suspensão).

Controlando a velocidade da CPU

As CPUs ativas podem ser colocadas on-line ou off-line, ter suas velocidades de clock e voltagens associadas alteradas (possivelmente também afetando as velocidades do barramento de memória e outros estados de energia do núcleo do sistema) e podem entrar em estados ociosos de baixa energia enquanto estão no loop ocioso do kernel. Ao medir diferentes estados de energia da CPU para o perfil de energia, evite a variação de consumo de energia ao medir outros parâmetros. O perfil de energia assume que todas as CPUs têm as mesmas velocidades disponíveis e características de energia.

Ao medir a potência da CPU, ou mantendo a potência da CPU constante para fazer outras medições, mantenha o número de CPUs online constante (como ter uma CPU online e o restante offline/hotplugged). Manter todas as CPUs, exceto uma na programação ociosa, pode produzir resultados aceitáveis. Interromper a estrutura do Android com a adb shell stop pode reduzir a atividade de agendamento do sistema.

Você deve especificar as velocidades de CPU disponíveis para seu dispositivo na entrada cpu.speeds do perfil de energia. Para obter uma lista de velocidades de CPU disponíveis, execute:

adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state

Essas velocidades correspondem às medições de potência correspondentes no valor cpu.active .

Para plataformas em que o número de núcleos colocados online afeta significativamente o consumo de energia, pode ser necessário modificar o driver ou controlador cpufreq para a plataforma. A maioria das plataformas suporta o controle da velocidade da CPU usando o controlador cpufreq do espaço do usuário e usando interfaces sysfs para definir a velocidade. Por exemplo, para definir a velocidade para 200 MHz em um sistema com apenas 1 CPU ou todas as CPUs compartilhando uma política cpufreq comum, use o console do sistema ou o shell adb para executar os seguintes comandos:

echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

Nota : Os comandos exatos diferem dependendo da implementação do cpufreq da plataforma.

Esses comandos garantem que a nova velocidade não esteja fora dos limites permitidos, definem a nova velocidade e imprimem a velocidade na qual a CPU está realmente funcionando (para verificação). Se a velocidade mínima atual antes da execução for maior que 200.000, pode ser necessário inverter a ordem das duas primeiras linhas ou executar a primeira linha novamente para eliminar a velocidade mínima antes de definir a velocidade máxima.

Para medir a corrente consumida por uma CPU funcionando em várias velocidades, use o console do sistema para colocar a CPU em um loop vinculado à CPU usando o comando:

# while true; do true; done

Faça a medição enquanto o loop é executado.

Alguns dispositivos podem limitar a velocidade máxima da CPU durante a execução de aceleração térmica devido a uma medição de alta temperatura (ou seja, após a execução de CPUs em altas velocidades por períodos prolongados). Observe essa limitação, usando a saída do console do sistema ao fazer medições ou verificando o log do kernel após a medição.

Para o valor cpu.awake , meça a energia consumida quando o sistema não estiver em suspensão e não estiver executando tarefas. A CPU deve estar em um loop ocioso do agendador de baixa potência, possivelmente executando uma instrução ARM Wait For Event ou em um estado de baixa potência específico do SoC com uma latência de saída rápida adequada para uso inativo.

Para o valor cpu.active , meça a energia quando o sistema não estiver no modo de suspensão e não estiver executando tarefas. Uma CPU (geralmente a CPU primária) deve executar a tarefa enquanto todas as outras CPUs devem estar em estado ocioso.

Medindo a potência da tela

Ao medir a tela ligada, certifique-se de que outros dispositivos normalmente ligados quando a tela está habilitada também estejam ligados. Por exemplo, se a tela sensível ao toque e a luz de fundo da tela estiverem normalmente ligadas quando a tela estiver ligada, certifique-se de que esses dispositivos estejam ligados ao medir para obter um exemplo realista de uso de energia da tela.

Algumas tecnologias de exibição variam no consumo de energia de acordo com as cores exibidas, fazendo com que as medições de energia variem consideravelmente dependendo do que é exibido na tela no momento da medição. Ao medir, certifique-se de que a tela esteja exibindo algo que tenha características de potência de uma tela realista. Aponte entre os extremos de uma tela totalmente preta (que consome menos energia para algumas tecnologias) e uma tela totalmente branca. Uma escolha comum é a visualização de uma agenda no aplicativo de calendário, que tem uma mistura de fundo branco e elementos não brancos.

Meça a tela na energia no brilho mínimo e máximo da tela/luz de fundo. Para definir o brilho mínimo:

  • Use a interface do usuário do Android (não recomendado). Defina o controle deslizante Configurações > Brilho da tela para o brilho mínimo da tela. No entanto, a interface do usuário do Android permite definir o brilho apenas para um mínimo de 10-20% do brilho possível do painel/luz de fundo e não permite definir o brilho tão baixo que a tela pode não ser visível sem grande esforço.
  • Use um arquivo sysfs (recomendado). Se disponível, use um arquivo sysfs para controlar o brilho do painel até o brilho mínimo suportado pelo hardware.

Além disso, se o arquivo sysfs da plataforma permitir ligar e desligar o painel LCD, a luz de fundo e a tela sensível ao toque, use o arquivo para fazer medições com a tela ligada e desligada. Caso contrário, defina um wakelock parcial para que o sistema não seja suspenso e, em seguida, ligue e desligue a tela com o botão liga/desliga.

Medindo a potência do Wi-Fi

Realize medições de Wi-Fi em uma rede relativamente silenciosa. Evite introduzir trabalho adicional processando grandes volumes de tráfego de transmissão que não esteja relacionado à atividade que está sendo medida.

O valor wifi.on mede a energia consumida quando o Wi-Fi está ativado, mas não está transmitindo ou recebendo ativamente. Isso geralmente é medido como o delta entre o consumo atual no estado de suspensão (suspensão) do sistema com Wi-Fi ativado versus desativado.

O valor wifi.scan mede a energia consumida durante uma varredura de Wi-Fi para pontos de acesso. Os aplicativos podem acionar verificações de Wi-Fi usando a API startScan() . Você também pode abrir Configurações> Wi-Fi, que executa verificações de ponto de acesso a cada poucos segundos com um salto aparente no consumo de energia, mas você deve subtrair a energia da tela dessas medições.

Nota : Use uma configuração controlada (como iperf ) para gerar tráfego de recepção e transmissão de rede.