|
|
  |
STM32 rtc.c библиотека, Грабельки - с 02.01.13 отставание на 1 день |
|
|
|
Feb 19 2013, 13:09
|
Местный
  
Группа: Свой
Сообщений: 294
Регистрация: 7-01-05
Пользователь №: 1 832

|
В очередной раз подтверждаю - проверять все и проверять чужое! В нескольких сотнях серийно выпущенных устройств с 1 февраля этого года часы идут на сутки раньше. Т.е. задаешь дату например 19 фев, а возвращает 18. Библиотечка с сайта st. Там функции конверсии структуры даты в long int и назад: Для дат 1.февраля и 31 января 2013 года одинаковое значение long int t = 412966800 влип! tt.year = 13; tt.month = 2; tt.mday = 01; //tt.wday= tt.hour = 17; tt.min = 00; tt.sec = 00; t = rtc_struct_to_cnt( &tt ); rtc_cnt_to_struct( t, &tt ); printf("t=%u\r\n", t); printf("%2u/%02u/%02u %2u:%02u:%02u\r\n", tt.mday, tt.month, tt.year, tt.hour, tt.min, tt.sec); Кто еще налетел? Кто уже нашел? Сижу ищу. Прилагаю исходники.
Прикрепленные файлы
pack.zip ( 2.12 килобайт )
Кол-во скачиваний: 24
|
|
|
|
|
Feb 19 2013, 19:24
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(Firer @ Feb 19 2013, 17:09)  Сижу ищу. Либо я что-то не понимаю, либо... А зачем вообще нужны функции конверсии времени в Сях, где есть штатные gmtime() / localtime() ? Кроме переопределения time() на собственную элементарную имплементацию, вообще никаких забот. Или я что-то все же упустил?
|
|
|
|
|
Feb 20 2013, 08:19
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(SasaVitebsk @ Feb 20 2013, 10:36)  Вот тогда приводят всё, например к секундам относительно 1.1.2000. Ну да. Только с точностью до наоборот - изначально время только в таком виде. А всё остальное, в частности конверсии - просто нахлобучки сверху, для удобства. Но мой вопрос был в другом - при наличии стандартной "нахлобучки", в виде gmtime() / localtime(), зачем изобретать велосипед?
|
|
|
|
|
Feb 20 2013, 08:22
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(AHTOXA @ Feb 20 2013, 12:13)  Вот, именно это и называется time_t (только с 1970 года) Стандарт говорит, что Цитата The range and precision of times representable in clock_t and time_t are implementation-defined Однако тут сказано, что "почти всегда" это число секунд с начала 1970 года. Для пущей уверенности можно вставить в программу assert() на это дело, чтобы при переходе на другую библиотеку не получился сюрприз.
|
|
|
|
|
Feb 20 2013, 15:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата В очередной раз подтверждаю - проверять все и проверять чужое! А проверять действительно надо! Особенно когда сторонние библиотеки используются. Вчера столкнулся - делаю прогу, все норомально. Добавляю функции UART, путем подключения модуля с другой программы, где все работало, меняю UART3 на UART2 ну и ноэки куда оно подключено - нифига не работает. Я тихо фигею, смотрю отладчиком - нет TXE. Потом гляжу - что-то регистр битрейта какой-то очень странный. Устанавливал я его при ините уарта, библиотечной функцией. Плюю на библиотеку, ставлю руками наобум число - все работает. Что оказалось - виноват был расчет регистра битрейта в STшной библиотеке - в предыдушем девайсе был сначала HSE=24Mhz, потом 25Mhz, и все было ОК. А в новом девайсе уже HSE_VAL=24.5MHz и библиотека обломалась на некруглом числе.
|
|
|
|
|
Feb 21 2013, 09:33
|

Местный
  
Группа: Участник
Сообщений: 215
Регистрация: 13-12-06
Из: fghgfh
Пользователь №: 23 476

|
Тоже такая ситуация, у меня часы с жпс, проц f100, ежедневная синхронизация в 6 утра. Глюк с запаздыванием даты был замечен 10 февраля, но он может был и раньше. По этой теме понял что есть проблема, попробую сегодня разобраться. Значит методом тыка было замечено , что проблема именно 2 месяца, 13..14..15 года. Можно переждать этот месяц))) Проблема возникает когда в феврале 28 дней Наверно это чисто моя проблема и к топик-стартеру не относится. Выявил компенсацию не понятную мне, но после ее отмены все кодируется и декодируется нормально. Проверял 2016 годом где в феврале 29 дней, переходит нормально, ну и где 28 дней тоже. Код /* Leap year? adjust February */ if (year%400 == 0 || (year%4 == 0 && year%100 !=0)) { ; } else { if (t->month > 1) { // result--; //непонятная компенсация } }
--------------------
|
|
|
|
|
Feb 22 2013, 18:18
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 5-12-08
Из: Санкт-Петербург
Пользователь №: 42 220

|
Цитата(yarunt @ Feb 21 2013, 13:33)  Код /* Leap year? adjust February */ if (year%400 == 0 || (year%4 == 0 && year%100 !=0)) { ; } else { if (t->month > 1) { // result--; //непонятная компенсация } } Компенсация-то понятная - чуть выше мы складываем число дней во всех месяцах меньше текущего, и в массиве числа дней для февраля значится 29. Следовательно, если год не високосный, то надо вычесть один день. А бага простая - мы начинаем вычитать день не с марта, а уже с февраля, хотя тот самый 29-й день еще не наступил. Исправить багу просто: Код if (t->month > 2) { // 2 - это февраль, а корректировать надо начиная с марта result--; } Кстати, небольшой оффтопик: лично мне кажется, что часы в F2/F4 сильно испортили по сравнению с F1. В F1 время хранилось в виде числа секунд, и совершенно простейшим образом тикало, сравнивалось, складывалось и вычиталось. И можно было в низкоуровневом коде вообще забить на все часовые пояса, летнее/зимнее время, leap seconds и все такое прочее, а вводить эти сложности уже на самом верхнем уровне, непосредственно при печати времени для человека, где и думать, в каком виде человек хочет это время увидеть. В F4 же теперь приходится хранить в человекочитаемом виде, а для всех операций конвертировать в нормальное 32-битное. Опять же, например, я совершенно не верю ST-шной железной реализации правильных коррекций времени. Ну вот ни на грамм не верю, что они в момент June 30, 2012 23:59:60 UTC выдавали правильное время, а не на секунду позже, 1 июля 00:00:00  А иногда это важно.
|
|
|
|
|
Mar 12 2013, 14:58
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 8-01-13
Пользователь №: 75 111

|
Цитата(SasaVitebsk @ Feb 19 2013, 21:30)  Там вообще нечего заимствовать. Посмотрел f1 и f2/4, становится совершенно понятно, что f1 rtc просто никакие. А библиотека под них затачивалась. А для f4 уже допиливалась. И общая картина катастрофическая .... Не так, не там, не то ... Я изначально переписал с нуля. Писал для f4. А потом лучше f1 допилю под эту. Часы у четвёрки нормально сделаны. А не могли бы Вы поделиться библиотекой? Мне просто в девайсе на ф4 тоже часы нужны
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|