Как 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: я надеюсь, что вы одобряете изменения, я чувствую, что они добавляют к вашему превосходному ответу, разъясняя пару структур предложений.
Тони