|
родить аналог difftime() и time() |
|
|
|
Sep 16 2010, 23:03
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 17 2010, 07:47
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(Dron_Gus @ Sep 17 2010, 10:48)  localtime() mktime() Вам в помощь. (time.h) так нету такого. Уточняю - процессоры lpc21xx, 23xx и 17хх и никаких линуксов.
|
|
|
|
|
Sep 17 2010, 08:25
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(Dron_Gus @ Sep 17 2010, 12:19)  Не знаю, что за компилятором Вы пользуетесь (Вы его не указали). Но с CrossStudio (GCC) и IAR библиотеки с такими функциями идут. keil'ом
|
|
|
|
|
Sep 17 2010, 08:41
|
Местный
  
Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688

|
Цитата(_Pasha @ Sep 17 2010, 12:20)  если скажете еще, что никаких newlib'ов, Вам не поверят  что такое newlib слава богу отвечает гугль. и там, как и в других линуксах есть difftme() и time() но всего лишь как обертки к gettimeofday(), которое внутре издаёт сисколл, который возвращает структуру time_t, в которой одно из полей - количество секунд с начала эпохи. регистры RTC содержат все поля time_t кроме tv_sec
|
|
|
|
|
Sep 17 2010, 09:13
|
Местный
  
Группа: Участник
Сообщений: 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Сколько оно будет выполнятся - хз
|
|
|
|
|
Sep 17 2010, 09:37
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(evgen2 @ Sep 17 2010, 13:13)  Мда - зубодробильня какая-то... 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
|
|
|
|
|
Sep 17 2010, 09:50
|

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

|
Посмотрите во вложении. Функции преобразования даты в long-переменную, показывающую кол-во секунд и функции обратного преобразования. Украл то ли здесь, то ли на сахаре. Немного подшаманил.
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Sep 17 2010, 09:55
|
Местный
  
Группа: Участник
Сообщений: 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);
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|