Jak millis () resetuje się do zera

14

Patrząc na dokumentację millis()funkcji, mówi:

Zwraca liczbę milisekund od uruchomienia przez Arduino bieżącego programu. Liczba ta przepełni się (wróci do zera) po około 50 dniach.

Jak to możliwe? Czy Arduino wykrywa, kiedy millis()przepełnienie resetuje wartość do 0? Jeśli tak, to jak to zrobić? Chcę tylko wiedzieć, co dokładnie dzieje się pod maską ze zmienną zwracaną przez millis()funkcję.

Programista
źródło

Odpowiedzi:

25

To nie jest wyłączna własność firmy millis(). Każdy licznik z ograniczoną liczbą cyfr ostatecznie wraca do zera. Na przykład 4-cyfrowy licznik tally wraca do zera po 9999.

Pod maską jest zmienna millis()typu unsigned long, która w Arduino ma 32 bity. W tym przypadku 32 bity (binarne 0 i 1) są podobne do cyfr (od 0 do 9) na liczniku liczników.

Maksymalna to 11111111 11111111 11111111 11111111. Po millis()dodaniu wraca do zera 1. Maksymalna (32 „jedynki”) to 2^32 - 1, co równa się 4294967295w systemie liczb dziesiętnych. Maksymalna wartość licznika wynosi zatem 4 294 967 295 milisekund. Po przeliczeniu na dni masz około 49,71 dni.

tally couter

Juraj
źródło
5
Stare wersje systemu Windows również utrzymywały liczbę milisekund w 32-bitowej liczbie całkowitej, powodując nieprawidłowe działanie wielu programów po 49 dniach bezczynności.
Russell Borogove
dzięki JURAJ! Odpowiada na utrzymujące się wątpliwości. UPVOTED;)
Gil
PS: Mam nadzieję, że zatwierdzasz zmiany, czuję, że dodają one do twojej doskonałej odpowiedzi, wyjaśniając kilka struktur zdań.
Tony Gil