Какая временная метка будет иметь наилучшую эффективность использования пространства с интервалом в 10 лет и разрешением в 1 секунду? - PullRequest
8 голосов
/ 23 августа 2011

Для встроенного микроконтроллера нижнего уровня (8-бит) какая структура метки времени будет наименьшей? Я тоже рассматриваю нестандартные. Поскольку вычислительная мощность очень ограничена, также важно, чтобы считывание секунды, часа или дня и т. Д. Также было быстрым.

Этот вопрос охватывает мой вопрос, но мне нужно представить следующие 10 лет с разрешением секунды.

Обновление: Я буду хранить много временных меток в ограниченном пространстве EEPROM. Таким образом, эффективность размера имеет больший вес в моем случае. Расчеты (определение текущей временной метки больше двух или трех единиц, отображение текущей временной метки на ЖК-дисплее нестандартной конструкции) обычно выполняется каждую секунду.

Ответы [ 5 ]

7 голосов
/ 23 августа 2011

Мне нужно представить следующие 10 лет с разрешением секунды

Если вы используете uint32_t, у вас все в порядке до 2038 года с этими временными метками. Используя localtime, gmtime и так далее, вы можете преобразовать их в struct tm, если вам нужно, и извлечь день, месяц и т. Д.

2 голосов
/ 23 августа 2011

Поскольку π секунд - это нано-век (или 31 миллион секунд - один год), вам необходимо иметь возможность представлять значения до 3,2 × 10 8 для хранения данных за 10 лет.,Таким образом, вам нужно как минимум 29 бит для хранения таких значений, что делает 32-битное число очевидным выбором.Вам необходимо продумать, как вы будете определять свою эпоху - дату начала для времени 0. Но 32-разрядное число со знаком может хранить до 68 лет секунд (например, Unix; 32-разрядные значения со знаком для time_t поддерживаетдиапазон 1970-2037), что является большим диапазоном.

2 голосов
/ 23 августа 2011

Это немного зависит от того, что вы хотите сделать с указанной отметкой времени и откуда она будет поступать.

Часто во встроенных ситуациях система имеет RTC (часы реального времени), у вас есть?Или вы отслеживаете время, используя часы процессора или таймер 1 Гц?Если у вас есть RTC, я был бы склонен использовать формат с часов и сохранить дальнейшую обработку.

Также важно, нужно ли обрабатывать эту временную метку локально?Если вам нужно поработать с ним на самом микро-устройстве, вы сможете сохранить его в формате, аналогичном нужному вам.Например, если вам нужно отобразить дату на экране, сохранив ее в упакованном формате, аналогичном формату ответа , который вы уже связали, имеет смысл.

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

Что касается десятичного числа BCD, существует довольно много вопросов о преобразовании из BCD для пример , в то время какэтот вопрос изначально был C # ответ должен быть почти идентичным в C.

1 голос
/ 23 августа 2011

Есть 86 400 секунд в день.

Если на мгновение игнорировать високосные годы (и всего високосные секунды), то в году 31 536 000 секунд.

Это составляет 315 360 000 за 10 лет.

Добавьте три високосных дня, которые могут произойти за 10 лет, и вы получите: 315 619 200

Это число требует 29биты для представления, так что вы также можете использовать 32-битное представление.

0 голосов
/ 24 августа 2011

Я бы использовал 32-битный без знака.Напишите подпрограмму для преобразования текущей даты / времени в секунды с момента запуска и одну для преобразования секунд в дату / время.

Каждое устройство может сделать 0 первым вводом даты / времени в устройство.Затем всякий раз, когда дата / время вводятся или выводятся, они массируются с использованием правильной функции.Пользователь никогда не знает, что внутренние значения хранятся в секундах с момента установки даты / времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...