Может ли now() перевернуться так же, как millis()?

Я использую now() и millis() для запуска событий по истечении определенного времени. Я знаю, и это также легко найти в Интернете, что millis() перезагружается по прошествии определенного времени, и для кода, который должен выполняться бесконечно, вам придется с этим справиться.

Однако я не знаю, сможет ли now() сделать то же самое в какой-то момент. Я имею в виду, что секунды отсчитываются с 1 января 1970 года, поэтому, учитывая этот факт, они не должны переворачиваться. Однако, как и в случае с millis(), это нужно где-то посчитать, нет? Как это работает?

, 👍1

Обсуждение

О каком «сейчас()» вы говорите? Не могли бы вы дать ссылку?, @Edgar Bonet

@EdgarBonet, вероятно, https://www.arduino.cc/en/Reference/CurieTimeNow, @Michel Keijzers

он спрашивает о секундах Эпохи в Arduino, используемых в TimeLib., @Juraj

Возможно, стоит отметить, что вам не обязательно «обрабатывать» ролловер millis(); вам просто нужно правильно подготовить сравнение, и не будет проблем с опрокидыванием, если вы пытаетесь сравнить длительности, меньшие, чем максимальное значение millis()., @jose can u c


3 ответа


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

3

Если now() взят из TimeLib.h библиотека, затем это определение:

typedef unsigned long time_t;

указывает, что time_t представляет собой 32-битное беззнаковое значение. Поскольку он представляет секунды с 00:00:00 1 января 1970 года, он будет переворачиваться при представлении дат после примерно 2106 года (1 января 1970 года + 2 ^ 32 секунды). Будучи беззнаковым, он также не может представлять даты ранее 1 января 1970 г.

Это немного отличается от Проблемы опрокидывания 2038 года, которая возникает, когда система определяет time_t как 32-битное целое число со подписью, поэтому этот перенос произойдет раньше, в 2038 году.

Все это зависит от того, как/где определен тип time_t для вашей архитектуры ЦП, и в этом ответе предполагается 8-битный AVR, такой как Arduino Uno. Если вы используете другую архитектуру, для которой TimeLib.h имеет другое определение типа, прочитайте исходный код, чтобы точно узнать, с чем вы имеете дело.

,

извините, long — это 32 бита и в 32-битной системе, @Juraj

Компилятор Arm gcc и xtensa имеет time_t со знаком long, @Juraj

Да, это сильно зависит от архитектуры., @jose can u c

Спасибо, это тот ответ, который я искал., @Streamline


6

now() — это функция, специфичная для плат на базе Intel Curie.

Он возвращает unsigned long (который в 32-битной системе аналогичен unsigned int) и поэтому может предоставить количество секунд, прошедших с 1/1. /1970 до 2106 года, после чего все изменится.

Если вы планируете, что ваша система будет работать непрерывно более следующих 88 лет, вам придется правильно отреагировать на этот переход, в том числе:

  • Использование вычитания для «округления» вычислений.
  • Не пытайтесь рассчитывать периоды продолжительностью более 136 лет.
,

0

Время, представленное в секундах с 1 января 1970 года, называется эпохой или временем Unix. Функция now() и аналогичные функции в библиотеках Arduino, возвращающие «эпоху», используют 32-битное представление. Некоторые используют тип time_t, определенный в базовых пакетах, поставляемых вместе с компилятором (types.h). В некоторых компиляторах или во многих библиотеках времени и RTC 32-битный тип подписан, что позволяет представлять время до 1970 года, в некоторых системах этот тип не имеет знака.

Знаковый 32-битный тип для эпохального времени переполняется в 2038 году ( Проблема 2038 года). Беззнаковое 32-битное переполнение в 2106.

Я использую библиотеку TimeLib, и она использует тип time_t, определенный в SAMD и ESP в type.h, распространяемом вместе с компилятором. ARM GCC имеет длину time_t, что соответствует 32-битному типу. То же самое для плат ESP с компилятором xtensa. time_t для AVR определен в библиотеке TimeLib как 32-битный беззнаковый тип и переполняется в 2016 году.

,