реклама на сайте
подробности

 
 
> STM32 rtc.c библиотека, Грабельки - с 02.01.13 отставание на 1 день
Firer
сообщение Feb 19 2013, 13:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
yarunt
сообщение Feb 21 2013, 09:33
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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--;                                        //непонятная компенсация
        }
    }


--------------------
Нельзя впихнуть,невпихуемое?МОЙ БЛОГ
Go to the top of the page
 
+Quote Post
Andrey Vasilyev
сообщение Feb 22 2013, 18:18
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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 sm.gif А иногда это важно.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 02:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016