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

 
 
 
Reply to this topicStart new topic
> 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
VAI
сообщение Feb 19 2013, 14:07
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Вам надо бы уточнить, что это для STM32F1xx...


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 19 2013, 17:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(VAI @ Feb 19 2013, 18:07) *
Вам надо бы уточнить, что это для STM32F1xx...

Там вообще нечего заимствовать. Посмотрел f1 и f2/4, становится совершенно понятно, что f1 rtc просто никакие. А библиотека под них затачивалась. А для f4 уже допиливалась. И общая картина катастрофическая .... Не так, не там, не то ...
Я изначально переписал с нуля. Писал для f4. А потом лучше f1 допилю под эту.
Часы у четвёрки нормально сделаны.
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Feb 19 2013, 19:24
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(Firer @ Feb 19 2013, 17:09) *
Сижу ищу.

Либо я что-то не понимаю, либо... А зачем вообще нужны функции конверсии времени в Сях, где есть штатные gmtime() / localtime() ?
Кроме переопределения time() на собственную элементарную имплементацию, вообще никаких забот. Или я что-то все же упустил?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 20 2013, 06:36
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Tahoe @ Feb 19 2013, 23:24) *
А зачем вообще нужны функции конверсии времени ...

Скорее всего для сравнения.
Ну например вы работаете с архивами. У вас запрос "найти запись со временем раньше чем ...", ну и так далее... И всё на этом построено. Сравнивать лесенкой годы, месяцы и так далее ... длительный процесс. А если у вас такого по программе куча?
Вот тогда приводят всё, например к секундам относительно 1.1.2000. И время хнанят в таком виде. А сравнение - одно сравнение.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 20 2013, 08:13
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(SasaVitebsk @ Feb 20 2013, 12:36) *
Сравнивать лесенкой годы, месяцы и так далее ... длительный процесс. А если у вас такого по программе куча?
Вот тогда приводят всё, например к секундам относительно 1.1.2000. И время хнанят в таком виде. А сравнение - одно сравнение.

Вот, именно это и называется time_t (только с 1970 года), и именно с таким временем работают функции из <time.h>.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Tahoe
сообщение Feb 20 2013, 08:19
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600



Цитата(SasaVitebsk @ Feb 20 2013, 10:36) *
Вот тогда приводят всё, например к секундам относительно 1.1.2000.

Ну да. Только с точностью до наоборот - изначально время только в таком виде. А всё остальное, в частности конверсии - просто нахлобучки сверху, для удобства. Но мой вопрос был в другом - при наличии стандартной "нахлобучки", в виде gmtime() / localtime(), зачем изобретать велосипед?
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 20 2013, 08:22
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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() на это дело, чтобы при переходе на другую библиотеку не получился сюрприз.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Feb 20 2013, 15:32
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата
В очередной раз подтверждаю - проверять все и проверять чужое!


А проверять действительно надо! Особенно когда сторонние библиотеки используются.
Вчера столкнулся - делаю прогу, все норомально. Добавляю функции UART, путем подключения модуля с другой программы, где все работало, меняю UART3 на UART2 ну и ноэки куда оно подключено - нифига не работает.
Я тихо фигею, смотрю отладчиком - нет TXE. Потом гляжу - что-то регистр битрейта какой-то очень странный. Устанавливал я его при ините уарта, библиотечной функцией.
Плюю на библиотеку, ставлю руками наобум число - все работает.
Что оказалось - виноват был расчет регистра битрейта в STшной библиотеке - в предыдушем девайсе был сначала HSE=24Mhz, потом 25Mhz, и все было ОК. А в новом девайсе уже HSE_VAL=24.5MHz и библиотека обломалась на некруглом числе.
Go to the top of the page
 
+Quote Post
yarunt
сообщение Feb 21 2013, 09:33
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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
AHTOXA
сообщение Feb 22 2013, 18:50
Сообщение #12


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Andrey Vasilyev @ Feb 23 2013, 00:18) *
Кстати, небольшой оффтопик: лично мне кажется, что часы в F2/F4 сильно испортили по сравнению с F1.
В F1 время хранилось в виде числа секунд, и совершенно простейшим образом тикало, сравнивалось, складывалось и вычиталось.

+1. Я тоже был опечален этими изменениями.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Misha_Traktorist
сообщение Mar 12 2013, 14:58
Сообщение #13


Участник
*

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



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

А не могли бы Вы поделиться библиотекой? Мне просто в девайсе на ф4 тоже часы нужны
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th June 2025 - 23:13
Рейтинг@Mail.ru


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