Auratos 0 28 февраля, 2018 Опубликовано 28 февраля, 2018 · Жалоба Добрый день. Имеется на руках контроллер серии STM32F107xx. Пользуюсь активно таймером реального времени. И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета? Или там совсем все устроено по-другому? Объясните, пожалуйста Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
viakon 0 28 февраля, 2018 Опубликовано 28 февраля, 2018 · Жалоба Добрый день. Имеется на руках контроллер серии STM32F107xx. Пользуюсь активно таймером реального времени. И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета? Или там совсем все устроено по-другому? Объясните, пожалуйста Откуда, зададите оттуда и будет. Главное правильно преобразовать при синхронизации часов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Auratos 0 28 февраля, 2018 Опубликовано 28 февраля, 2018 (изменено) · Жалоба Откуда, зададите оттуда и будет. Главное правильно преобразовать при синхронизации часов. Можно, пожалуйста, поподробнее? Просто я пользуюсь библиотечной функцией при установке времени и даты void Set_Time(struct tm *t) { uint32_t CounterValue = (uint32_t)mktime(t); save_Time(CounterValue; } void save_Time(uint32_t tmr) { RTC_WaitForLastTask(); RTC_SetCounter(tmr); RTC_WaitForLastTask(); } Так вот, функция mktime не воспринимает дату позже февраля 2036 года (найдено опытным путем вплоть до минуты и секунды), т.к. при инкрементации новой секунды происходит переполнение 32-битного CounterValue. Или я неправильно Вас понял? Как выставить дату больше указанной? Изменено 28 февраля, 2018 пользователем Auratos Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 28 февраля, 2018 Опубликовано 28 февраля, 2018 · Жалоба И вот, собственно, возник вопрос: а какой у этого таймера диапазон измерения времени? Т.к. там 32-битный секундный счетчик, то максимум он сможет отсчитать ~136 лет. Отсчет начинается, как я понял, с 1900 года, т.е. до 2036 года. А что будет после его переполнения, т.е. после 2036 года? Можно ли самому подвинуть точку отсчета? Просто я пользуюсь библиотечной функцией при установке времени и даты ... mktime(t); Это библиотечная фунция, входящая в Си. В ней применяется UNIX-время (Unix Epoch). Отсчет начинается от 1 января 1970 года. 2036-м годом ограничено, потому что в 2038 UNIX-время достигнет 2х31 и может неверно интерпретироваться как отрицательное. Почитайте по ссылке. Вы можете сдвигать время как угодно, но при этом нужно будет применять свои функции или сдвигать стандартные. Я применяю время с 1 января 2000 года. Переписал функции и использую такой свой Timestamp. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Auratos 0 28 февраля, 2018 Опубликовано 28 февраля, 2018 · Жалоба Это библиотечная фунция, входящая в Си. В ней применяется UNIX-время (Unix Epoch). Отсчет начинается от 1 января 1970 года. 2036-м годом ограничено, потому что в 2038 UNIX-время достигнет 2х31 и может неверно интерпретироваться как отрицательное. Почитайте по ссылке. Вы можете сдвигать время как угодно, но при этом нужно будет применять свои функции или сдвигать стандартные. Я применяю время с 1 января 2000 года. Переписал функции и использую такой свой Timestamp. И вы также используете библиотечные функции localtime и mktime? А не могли бы вы, пожалуйста, привести пример своих функций для работы со временем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 28 февраля, 2018 Опубликовано 28 февраля, 2018 · Жалоба Разрешите поинтересоваться, что за устройство разрабатываете? Откуда тяга заглянуть так далеко в будущее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 28 февраля, 2018 Опубликовано 28 февраля, 2018 · Жалоба И вы также используете библиотечные функции localtime и mktime? А не могли бы вы, пожалуйста, привести пример своих функций для работы со временем? Если применять стандартные функции, то там все просто. Вот пример сдвига из программы тестера плат на ПК. GPSTmp.Time это timestamp в секундах от 1 янв 2000 года. На выходе печатается время в виде строки. struct tm time; time.tm_year = 2000-1900; time.tm_mon = 0; time.tm_mday = 1; time.tm_hour = 0; time.tm_min = 0; time.tm_sec = 0; time.tm_isdst = 0; time_t offset2000 = mktime(&time); GPSTmp.Time += offset2000; struct tm *ptime = localtime((time_t*)&GPSTmp.Time); char time_str[81]; strftime(time_str, 80, "%d-%m-%Y %X", ptime); fprintf(fpLog,"Time: %s\n", time_str); А в программах на МК использую свои переписанные функции. В качестве примера см. различные открытые библиотеки. Напр.: date_time.c UNIX time: 01-01-2000 00:00:00 = 946684800 sec = 10957 days Разрешите поинтересоваться, что за устройство разрабатываете? Откуда тяга заглянуть так далеко в будущее? 2038 год будет уже всего-то через 20 лет. А время бежит быстро. Вот сделаете вы какой-нибудь удачный прибор, и будут люди применять его 20 лет и хвалить. А тут раз - и из-за ошибки времени облом. Зачем сознательно закладывать ошибку, если ее можно легко избежать B) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Auratos 0 28 февраля, 2018 Опубликовано 28 февраля, 2018 · Жалоба 2038 год будет уже всего-то через 20 лет. А время бежит быстро. Вот сделаете вы какой-нибудь удачный прибор, и будут люди применять его 20 лет и хвалить. А тут раз - и из-за ошибки времени облом. Зачем сознательно закладывать ошибку, если ее можно легко избежать B) Все верно. Создаем вычислительное устройство, настал момент его сертифицировать, где мы гарантируем 15 лет бесперебойной работы, поэтому уже через 4 года мы не сможем гарантировать указанный срок службы, т.к. 2022 + 15 = 2037 год :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 28 февраля, 2018 Опубликовано 28 февраля, 2018 · Жалоба На самом деле, если формат хранения времени (timestamp) не выходит за пределы прибора, то вы можете его применять в любом виде: хоть в UNIX, хоть в смещенном. Важно чтобы переполнение обрабатывалось корректно и наружу прибора всегда выводилось бы правильное время. Мы себе такого позволить не можем, потому что наш смещенный формат timestamp-а передается в таком виде наружу в виде поля времени протокола связи и описан в документации для пользователя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться