Cómo millis () se restablece a 0

14

Mirando la documentación de la millis()función, dice:

Devuelve el número de milisegundos desde que la placa Arduino comenzó a ejecutar el programa actual. Este número se desbordará (volverá a cero), después de aproximadamente 50 días.

¿Cómo es esto posible? ¿Arduino detecta cuándo el millis()desbordamiento restablece el valor a 0? Si es así, ¿cómo lo hace? Solo quiero saber qué sucede exactamente debajo del capó con la variable que devuelve la millis()función.

Programador
fuente

Respuestas:

25

No es propiedad exclusiva de millis(). Cualquier contador con un número limitado de dígitos finalmente vuelve a cero. Por ejemplo, un contador de conteo de 4 dígitos vuelve a ceros después 9999.

Debajo del capó, la variable para millis()es de tipo unsigned long, que es de 32 bits en el Arduino. En este caso, los 32 bits (0 y 1 binarios) son similares a los dígitos (0 a 9) en el contador de conteo.

El maximo es 11111111 11111111 11111111 11111111. Una vez allí, millis()vuelve a cero cuando agrega 1. El máximo (32 "unos") es 2^32 - 1, que es igual 4294967295en el sistema de números decimales. El valor máximo para el contador es, por lo tanto, 4,294,967,295 milisegundos. Convertido a días, obtienes aproximadamente 49.71 días.

tally couter

Juraj
fuente
55
Las versiones antiguas de Windows también mantuvieron un recuento de milisegundos en un entero de 32 bits, lo que provocó que muchos programas se comporten mal después de 49 días de tiempo de actividad.
Russell Borogove
gracias JURAJ! Responde una duda persistente que tuve. UPVOTED;)
tony gil
PD: espero que apruebe las ediciones, creo que se suman a su excelente respuesta al aclarar un par de estructuras de oraciones.
Tony Gil