Як millis () скидає себе до 0


14

Дивлячись на документацію millis()функції, вона говорить:

Повертає кількість мілісекунд з моменту, коли плата Arduino почала запускати поточну програму. Приблизно через 50 днів ця кількість переповниться (повернеться до нуля).

Як це можливо? Чи виявляє Arduino, коли millis()переповнення потім скидає значення на 0? Якщо так, то як це робити? Я просто хочу знати, що саме відбувається під кришкою зі змінною, яку повертає millis()функція.

Відповіді:


25

Це не виняткова власність Росії millis(). Будь-який лічильник з обмеженою кількістю цифр з часом повертається до нуля. Наприклад, 4-значний лічильник рахунків повертається до нулів після 9999.

Під капотом змінна for millis()має тип unsigned long, який становить 32 біти на Arduino. У цьому випадку 32 біта (двійкові 0 і 1) схожі на цифри (0 до 9) на лічильнику підрахунків.

Максимум є 11111111 11111111 11111111 11111111. Потрапивши туди, millis()повертаючись до нуля, коли ви додасте 1. Максимум (32 "одиниці") є 2^32 - 1рівним 4294967295у десятковій системі числення. Таким чином, максимальне значення лічильника становить 4 294 967 295 мілісекунд. Перерахувавши на дні, ви отримаєте приблизно 49,71 день.

обчислювальний couter


5
Старі версії Windows також підтримували кількість мілісекунд у 32-бітному цілому чині, внаслідок чого багато програмного забезпечення поводилися недобре, ніж 49 днів роботи.
Рассел Борогов

дякую JURAJ! Відповідає на тривалий сумнів у мене. ПЕРЕГЛЯД;)
tony

PS: Я сподіваюся, що ви схвалили правки, я відчуваю, що вони додають вашій чудовій відповіді, уточнивши пару структур речень.
tony
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.