Comment millis () se réinitialise à 0

14

En regardant la documentation de la millis()fonction, il dit:

Renvoie le nombre de millisecondes depuis que la carte Arduino a commencé à exécuter le programme actuel. Ce nombre va déborder (revenir à zéro), après environ 50 jours.

Comment est-ce possible? Arduino détecte-t-il le millis()débordement, puis réinitialise-t-il la valeur à 0? Si oui, comment fait-il? Je veux juste savoir ce qui se passe exactement sous le capot avec la variable renvoyée par la millis()fonction.

Programmeur
la source

Réponses:

25

Ce n'est pas une propriété exclusive de millis(). Tout compteur avec un nombre limité de chiffres revient finalement à zéro. Par exemple, un compteur de pointage à 4 chiffres revient à zéro après 9999.

Sous le capot, la variable pour millis()est de type unsigned long, qui est de 32 bits sur l'Arduino. Dans ce cas, les 32 bits (0 et 1 binaires) sont similaires aux chiffres (0 à 9) sur le compteur de comptage.

Le maximum est 11111111 11111111 11111111 11111111. Une fois là, millis()revient à zéro lorsque vous ajoutez 1. Le maximum (32 "uns") est 2^32 - 1égal à 4294967295dans le système de nombres décimaux. La valeur maximale pour le compteur est donc de 4 294 967 295 millisecondes. Converti en jours, vous obtenez environ 49,71 jours.

tally couter

Juraj
la source
5
Les anciennes versions de Windows conservaient également un décompte de millisecondes dans un entier 32 bits, provoquant un mauvais comportement de nombreux logiciels après 49 jours de disponibilité.
Russell Borogove
merci JURAJ! Répond à un doute persistant que j'avais. MIS À JOUR;)
tony gil
PS: j'espère que vous approuvez les modifications, je pense qu'elles ajoutent à votre excellente réponse en clarifiant quelques structures de phrases.
tony gil