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


14

Глядя на документацию по millis()функции, он говорит:

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

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

Ответы:


25

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

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

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

Tally Couter


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

спасибо ЮРАЙ! Ответы на давние сомнения у меня были. UPVOTED;)
Тони

PS: я надеюсь, что вы одобряете изменения, я чувствую, что они добавляют к вашему превосходному ответу, разъясняя пару структур предложений.
Тони
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.