Como millis () se redefine para 0

14

Observando a documentação da millis()função, ele diz:

Retorna o número de milissegundos desde que a placa Arduino começou a executar o programa atual. Esse número excederá (retornará a zero), após aproximadamente 50 dias.

Como isso é possível? O Arduino está detectando quando o millis()estouro excede o valor para 0? Se sim, como isso acontece? Eu só quero saber o que exatamente está acontecendo sob o capô com a variável que está sendo retornada pela millis()função.

Programador
fonte

Respostas:

25

Não é uma propriedade exclusiva de millis(). Qualquer contador com um número limitado de dígitos acaba retornando a zero. Por exemplo, um contador de 4 dígitos retorna para zeros depois 9999.

Sob o capô, a variável for millis()é do tipo unsigned long, que é de 32 bits no Arduino. Nesse caso, os 32 bits (zeros e 1s binários) são semelhantes aos dígitos (0 a 9) no contador de contagem.

O máximo é 11111111 11111111 11111111 11111111. Uma vez lá, millis()retorna a zero quando você adiciona 1. O máximo (32 "ones") é 2^32 - 1igual 4294967295ao sistema de números decimais. O valor máximo para o contador é, portanto, 4.294.967.295 milissegundos. Convertido em dias, você recebe aproximadamente 49,71 dias.

tally couter

Juraj
fonte
5
As versões antigas do Windows também mantinham uma contagem de milissegundos em um número inteiro de 32 bits, fazendo com que muitos softwares se comportassem mal após 49 dias de atividade.
Russell Borogove
obrigado JURAJ! Responde a uma dúvida que eu tive. UPVOTED;)
tony gil
PS: espero que você aprove as edições, acho que elas contribuem para sua excelente resposta, esclarecendo algumas estruturas de frases.
gil tony