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.

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.