Может ли now() перевернуться так же, как millis()?
Я использую now() и millis() для запуска событий по истечении определенного времени. Я знаю, и это также легко найти в Интернете, что millis() перезагружается по прошествии определенного времени, и для кода, который должен выполняться бесконечно, вам придется с этим справиться.
Однако я не знаю, сможет ли now() сделать то же самое в какой-то момент. Я имею в виду, что секунды отсчитываются с 1 января 1970 года, поэтому, учитывая этот факт, они не должны переворачиваться. Однако, как и в случае с millis(), это нужно где-то посчитать, нет? Как это работает?
@Streamline, 👍1
Обсуждение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
now()
— это функция, специфичная для плат на базе Intel Curie.
Он возвращает unsigned long
(который в 32-битной системе аналогичен unsigned int
) и поэтому может предоставить количество секунд, прошедших с 1/1. /1970 до 2106 года, после чего все изменится.
Если вы планируете, что ваша система будет работать непрерывно более следующих 88 лет, вам придется правильно отреагировать на этот переход, в том числе:
- Использование вычитания для «округления» вычислений.
- Не пытайтесь рассчитывать периоды продолжительностью более 136 лет.
Время, представленное в секундах с 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 году.
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как получить уникальный идентификатор для всех плат Arduino?
- Как очистить буфер FIFO на MPU6050?
- Элегантное решение для обновления содержимого TFT-дисплея
- Считывание нескольких поворотных энкодеров
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
О каком «сейчас()» вы говорите? Не могли бы вы дать ссылку?, @Edgar Bonet
@EdgarBonet, вероятно, https://www.arduino.cc/en/Reference/CurieTimeNow, @Michel Keijzers
он спрашивает о секундах Эпохи в Arduino, используемых в TimeLib., @Juraj
Возможно, стоит отметить, что вам не обязательно «обрабатывать» ролловер
millis()
; вам просто нужно правильно подготовить сравнение, и не будет проблем с опрокидыванием, если вы пытаетесь сравнить длительности, меньшие, чем максимальное значение millis()., @jose can u c