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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> родить аналог difftime() и time()
evgen2
сообщение Sep 16 2010, 23:03
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Граждане, не подскажете, где бы взять исходники аналога функции difftime() в обычных сях ?

Есть RTC, есть регистры, из которых можно родить структуру со временем. Но как ее перевести в секунды с начала хоть 1970, хоть 1980 или любого другого года - непонятно (или, что тоже самое - родить аналог time() ). Задача состоит в определении интервала времени между событиями порядка часов-суток-месяцев. При этом не хотелось бы промахиваться мимо тазика в районе 28-29 февраля...

UPDATE: с удивлением обнаружил \Keil\ARM\RV31\INC\time.h Почему я это не нашел ночью - не знаю. В хелпе обещают, что

* mktime() and localtime() can be used immediately
* time() and clock() are system-specific and probably not usable unless reimplemented
* asctime(), ctime(), and strftime() require locale.



Сообщение отредактировал evgen2 - Sep 17 2010, 09:30
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 06:48
Сообщение #2


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



localtime() mktime() Вам в помощь. (time.h)


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
evgen2
сообщение Sep 17 2010, 07:47
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(Dron_Gus @ Sep 17 2010, 10:48) *
localtime() mktime() Вам в помощь. (time.h)

так нету такого.

Уточняю - процессоры lpc21xx, 23xx и 17хх и никаких линуксов.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 08:19
Сообщение #4


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Не знаю, что за компилятором Вы пользуетесь (Вы его не указали). Но с CrossStudio (GCC) и IAR библиотеки с такими функциями идут.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 17 2010, 08:20
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(evgen2 @ Sep 17 2010, 11:47) *
и никаких линуксов.

если скажете еще, что никаких newlib'ов, Вам не поверят smile.gif
Go to the top of the page
 
+Quote Post
evgen2
сообщение Sep 17 2010, 08:25
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(Dron_Gus @ Sep 17 2010, 12:19) *
Не знаю, что за компилятором Вы пользуетесь (Вы его не указали). Но с CrossStudio (GCC) и IAR библиотеки с такими функциями идут.

keil'ом
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 08:27
Сообщение #7


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Похоже в MDK их действительно нет. Тогда http://www.google.com/codesearch


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
evgen2
сообщение Sep 17 2010, 08:41
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(_Pasha @ Sep 17 2010, 12:20) *
если скажете еще, что никаких newlib'ов, Вам не поверят smile.gif

что такое newlib слава богу отвечает гугль.
и там, как и в других линуксах есть difftme() и time()

но всего лишь как обертки к gettimeofday(), которое внутре издаёт сисколл, который возвращает структуру time_t, в которой одно из полей - количество секунд с начала эпохи. регистры RTC содержат все поля time_t кроме tv_sec
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 08:59
Сообщение #9


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



time() возвращает количество секунд от... бла-бла-бла... его можно получить пересчетом регистров RTC функцией mktime.
difftime() это что-то вроде:
double difftime ( time_t time2, time_t time1 )
{
return (time2 - time1);
}


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
evgen2
сообщение Sep 17 2010, 09:13
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(Dron_Gus @ Sep 17 2010, 12:59) *
time() возвращает количество секунд от... бла-бла-бла... его можно получить пересчетом регистров RTC функцией mktime.
difftime() это что-то вроде:
double difftime ( time_t time2, time_t time1 )
{
return (time2 - time1);
}


Да, похоже что надо было искать mktime

но находится оно какое-то некузявое для embedded

http://www.google.com/codesearch/p?hl=ru#e...mktime%20lang:c

Сколько оно будет выполнятся - хз
Go to the top of the page
 
+Quote Post
sasamy
сообщение Sep 17 2010, 09:37
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(evgen2 @ Sep 17 2010, 13:13) *
но находится оно какое-то некузявое для embedded

http://www.google.com/codesearch/p?hl=ru#e...mktime%20lang:c


Мда - зубодробильня какая-то...

On a POSIX system, time_t is an arithmetic type, and one could just define
#define difftime(t1,t0) (double)(t1 - t0)

Реализацию остального можно посмотреть тут
http://prex.sourceforge.net/src/files/1129.html
Go to the top of the page
 
+Quote Post
VAI
сообщение Sep 17 2010, 09:50
Сообщение #12


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

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



Посмотрите во вложении.
Функции преобразования даты в long-переменную, показывающую кол-во секунд и функции обратного преобразования.
Украл то ли здесь, то ли на сахаре. Немного подшаманил.
Прикрепленные файлы
Прикрепленный файл  time_convert.zip ( 1.9 килобайт ) Кол-во скачиваний: 41
 


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
evgen2
сообщение Sep 17 2010, 09:55
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Цитата(sasamy @ Sep 17 2010, 13:37) *
Мда - зубодробильня какая-то...

On a POSIX system, time_t is an arithmetic type, and one could just define
#define difftime(t1,t0) (double)(t1 - t0)

Реализацию остального можно посмотреть тут
http://prex.sourceforge.net/src/files/1129.html


О, это явно проще, хотя засада очевидно перенесена в isleap(year)

И, как видно из mktime() - этот самый isleap будет нынче вызываться 40 раз, что явно не радует. Впрочем тут явно есть место для оптимизации.

Код
for (year = 1970; year < (unsigned int)(1900 + tmp->tm_year); year++)
               days += DAYSPERNYEAR + (isleap(year) ? 1 : 0);

Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Sep 17 2010, 10:19
Сообщение #14


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



А зачем каждый раз пересчитывать? У Вас в процессоре же есть прерывания с известным периодом? Тики операционки или еще что? Ну и делайте раз в секунду cur_time++; И вместо пересчета просто возвращайте текущее значение. Можно синхронизироваться периодически с внешними часами.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Sep 17 2010, 11:08
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Dron_Gus @ Sep 17 2010, 14:19) *
А зачем каждый раз пересчитывать? У Вас в процессоре же есть прерывания с известным периодом? Тики операционки или еще что? Ну и делайте раз в секунду cur_time++; И вместо пересчета просто возвращайте текущее значение. Можно синхронизироваться периодически с внешними часами.


Так собственно делается и в этой ОС,

http://prex.sourceforge.net/src/S/85.html

Go to the top of the page
 
+Quote Post

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

 


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


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