Как millis() сбрасывает себя на 0

Просматривая документацию по millis() function , он говорит:

Возвращает количество миллисекунд с момента запуска платы Arduino. запуск текущей программы. Это число будет переполнено (вернитесь к ноль), примерно через 50 дней.

Как это возможно? Обнаруживает ли Arduino переполнение millis(), а затем сбрасывает значение до 0? Если да, то как это сделать? Я просто хочу знать, что именно происходит внутри с переменной, возвращаемой функцией millis().

, 👍14


1 ответ


Лучший ответ:

25

Это не исключительное свойство millis(). Любой счетчик с ограниченным числом разрядов в конце концов возвращается к нулю. Например, 4-разрядный счетчик обнуляется после 9999.

Под капотом переменная для millis() имеет тип unsigned long, который на Arduino составляет 32 бита. В этом случае 32 бита (двоичные 0 и 1) аналогичны цифрам (от 0 до 9) на счетчике.

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

tally couter

,

Старые версии Windows также поддерживали счетчик миллисекунд в 32-битном целом числе, что приводило к неправильной работе многих программ после 49 дней безотказной работы., @Russell Borogove

спасибо ЮРАЙ! Отвечает на затянувшееся сомнение, которое у меня было. ПРОГОЛОСОВАНО ;), @tony gil

PS: я надеюсь, что вы одобрите правки, я чувствую, что они добавляют к вашему превосходному ответу, проясняя пару структур предложений., @tony gil