Считать время по пройденным миллисекундам в С.

jenya7
Дата: 04.12.2017 13:03:02
В системе нет RTC.
Я подумал сделать так. В начале логирования я ввожу стартовое реальное время и включаю счетчик миллисекунд.
Во время логирования, помимо данных, я сохраняю временную метку - пройденные миллисекунды.
И в конце логирования я могу вычислить реальное время по пройденным милисекундам.
uint32_t MillisecsToSeconds (uint32_t millisecs)
{
    return ( millisecs / 1000);
}

uint32_t MillisecsToMinutes (uint32_t millisecs)
{
    return ( millisecs / 60000); 
}

uint32_t MillisecsToHours (uint32_t millisecs)
{
    return ( millisecs / 3600000);   
}

uint32_t MillisecsToDays (uint32_t millisecs)
{
    return ( millisecs / 86400000);   
}

void ElapsedDate(sRTC start_date, uint32_t millisecs, sRTC *elapsed_date)
{
    elapsed_date->rtcSec = start_date.rtcSec + MillisecsToSeconds(millisecs)
    elapsed_date->rtcMin = start_date.rtcMin + MillisecsToMinutes(millisecs);
    elapsed_date->rtcHour = start_date.rtcHour + MillisecsToHours(millisecs);
    elapsed_date->rtcDay = start_date.rtcDay + MillisecsToDays(millisecs);
}


Но потом я заметил что функция не учитывает переполнение секунд, минут, дней. И вот тут я туплю - как оптимальней это сделать?
Dima T
Дата: 04.12.2017 13:09:09
В uint32_t входит всего 48,6 суток при дискретности 1 мс. Используй uint64_t
jenya7
Дата: 04.12.2017 13:46:50
Dima T
В uint32_t входит всего 48,6 суток при дискретности 1 мс. Используй uint64_t

мне хватит. лог не будет длиннее чем несколько дней.
Dima T
Дата: 04.12.2017 14:06:59
Надо вычислить смещение от начала суток и прибавлять его перед началом вывода.
void ElapsedDate(sRTC start_date, uint32_t millisecs, sRTC *elapsed_date)
{
    uint32_t offset = ((start_date.rtcHour * 60 + start_date.rtcMin) * 60 + start_date.rtcSec) * 1000;
    millisecs += offset;
    elapsed_date->rtcSec = MillisecsToSeconds(millisecs) % 60;
    elapsed_date->rtcMin = MillisecsToMinutes(millisecs) % 60;
    elapsed_date->rtcHour = MillisecsToHours(millisecs) % 24;
    elapsed_date->rtcDay = start_date.rtcDay + MillisecsToDays(millisecs);
}

Как вариант при инициализации millisecs выравнивать на 00:00:00.000
jenya7
Дата: 04.12.2017 14:28:25
Dima T
Надо вычислить смещение от начала суток и прибавлять его перед началом вывода.
void ElapsedDate(sRTC start_date, uint32_t millisecs, sRTC *elapsed_date)
{
    uint32_t offset = ((start_date.rtcHour * 60 + start_date.rtcMin) * 60 + start_date.rtcSec) * 1000;
    millisecs += offset;
    elapsed_date->rtcSec = MillisecsToSeconds(millisecs) % 60;
    elapsed_date->rtcMin = MillisecsToMinutes(millisecs) % 60;
    elapsed_date->rtcHour = MillisecsToHours(millisecs) % 24;
    elapsed_date->rtcDay = start_date.rtcDay + MillisecsToDays(millisecs);
}

Как вариант при инициализации millisecs выравнивать на 00:00:00.000


а почему модуль 60? если считаем милисекунды то модуль х1000.
    elapsed_date->rtcSec = start_date.rtcSec + (millisecs%1000) ;
    elapsed_date->rtcMin = start_date.rtcMin + (millisecs/60000)%60;
    elapsed_date->rtcHour = start_date.rtcHour + (millisecs/3600000)%24;
Dima T
Дата: 04.12.2017 14:47:06
jenya7
а почему модуль 60? если считаем милисекунды то модуль х1000.

В минуте сколько секунд?
jenya7
Дата: 04.12.2017 16:02:56
Dima T
jenya7
а почему модуль 60? если считаем милисекунды то модуль х1000.

В минуте сколько секунд?

понял. спасибо.