powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Считать время по пройденным миллисекундам в С.
7 сообщений из 7, страница 1 из 1
Считать время по пройденным миллисекундам в С.
    #39563633
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В системе нет RTC.
Я подумал сделать так. В начале логирования я ввожу стартовое реальное время и включаю счетчик миллисекунд.
Во время логирования, помимо данных, я сохраняю временную метку - пройденные миллисекунды.
И в конце логирования я могу вычислить реальное время по пройденным милисекундам.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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);
}



Но потом я заметил что функция не учитывает переполнение секунд, минут, дней. И вот тут я туплю - как оптимальней это сделать?
...
Рейтинг: 0 / 0
Считать время по пройденным миллисекундам в С.
    #39563640
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В uint32_t входит всего 48,6 суток при дискретности 1 мс. Используй uint64_t
...
Рейтинг: 0 / 0
Считать время по пройденным миллисекундам в С.
    #39563674
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TВ uint32_t входит всего 48,6 суток при дискретности 1 мс. Используй uint64_t
мне хватит. лог не будет длиннее чем несколько дней.
...
Рейтинг: 0 / 0
Считать время по пройденным миллисекундам в С.
    #39563690
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо вычислить смещение от начала суток и прибавлять его перед началом вывода.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
Считать время по пройденным миллисекундам в С.
    #39563717
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНадо вычислить смещение от начала суток и прибавлять его перед началом вывода.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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.
Код: plaintext
1.
2.
3.
    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;
...
Рейтинг: 0 / 0
Считать время по пройденным миллисекундам в С.
    #39563745
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7а почему модуль 60? если считаем милисекунды то модуль х1000.
В минуте сколько секунд?
...
Рейтинг: 0 / 0
Считать время по пройденным миллисекундам в С.
    #39563852
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima Tjenya7а почему модуль 60? если считаем милисекунды то модуль х1000.
В минуте сколько секунд?
понял. спасибо.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Считать время по пройденным миллисекундам в С.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]