Come millis () si reimposta su 0


14

Guardando la documentazione per la millis()funzione, si dice:

Restituisce il numero di millisecondi da quando la scheda Arduino ha iniziato a eseguire il programma corrente. Questo numero traboccerà (tornerà a zero), dopo circa 50 giorni.

Com'è possibile? Arduino sta rilevando quando l' millis()overflow quindi reimposta il valore su 0? In tal caso, come lo fa? Voglio solo sapere cosa sta succedendo esattamente sotto il cofano con la variabile che viene restituita dalla millis()funzione.

Risposte:


25

Non è una proprietà esclusiva di millis(). Qualsiasi contatore con un numero limitato di cifre alla fine torna a zero. Ad esempio, un contatore di conteggio di 4 cifre ritorna dopo a zero 9999.

Sotto il cofano, la variabile per millis()è di tipo unsigned long, che è 32 bit su Arduino. In questo caso, i 32 bit (0 e 1 binari) sono simili alle cifre (da 0 a 9) sul contatore di conteggio.

Il massimo è 11111111 11111111 11111111 11111111. Una volta lì, millis()torna a zero quando si aggiunge 1. Il massimo (32 "uni") è 2^32 - 1, che equivale 4294967295al sistema dei numeri decimali. Il valore massimo per il contatore è quindi 4.294.967.295 millisecondi. Convertito in giorni ottieni circa 49,71 giorni.

tally couter


5
Le vecchie versioni di Windows mantenevano anche un conteggio dei millisecondi in un numero intero a 32 bit, causando un comportamento anomalo di molti software dopo 49 giorni di attività.
Russell Borogove,

grazie JURAJ! Risposte a un persistente dubbio che avevo. VOTATO;)
tony gil,

PS: spero che approvi le modifiche, penso che si aggiungano alla tua eccellente risposta chiarendo un paio di strutture di frasi.
tony gil,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.