PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Im Treiber System Uhr abfragen



7.e.Q
04-10-2005, 14:29
Hi Leute,

in normalen Linux Programmen kann man ja per gettimeofday die aktuelle Uhrzeit erfragen. Wie geht das in Linux Treibern (Kernel 2.6)?

Danke

Gruß,
Hendrik

7.e.Q
05-10-2005, 10:20
Hmm, so 'ne einfache Frage und keiner weiß 'ne Antwort? Hmmmm... egal, hab's inzwischen selbst herausgefunden:

do_gettimeofday(struct timeval* tv);

danke trotzdem!

anda_skoa
05-10-2005, 12:53
Ich denke mal, daß außer dir hier niemand Kernel Programmierung macht :)

Ciao,
_

Lord Kefir
05-10-2005, 17:16
Habe das in dem LKM an dem ich momentan arbeite so gelöst...

Du brauchst erst mal folgende Macros und Datentypen:


// Macros:
#define DPRINT(level, format, args...) printk (level M_NAME ": " format, ##args)
#define SECS_PER_HOUR (60 * 60)
#define SECS_PER_DAY (SECS_PER_HOUR * 24)
#define isleap(year) ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
#define DIV(a, b) ((a) / (b) - ((a) % (b) < 0))
#define LEAPS_THRU_END_OF(y) (DIV (y, 4) - DIV (y, 100) + DIV (y, 400))

// datatypes:
struct vtm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
};


Hinzu kommen noch zwei Funktionen:


int epoch2time (const time_t *t, long int offset, struct vtm *tp) {
static const unsigned short int mon_yday[2][13] = {
/* Normal years. */
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
/* Leap years. */
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
};

long int days, rem, y;
const unsigned short int *ip;

days = *t / SECS_PER_DAY;
rem = *t % SECS_PER_DAY;
rem += offset;
while (rem < 0) {
rem += SECS_PER_DAY;
--days;
}
while (rem >= SECS_PER_DAY) {
rem -= SECS_PER_DAY;
++days;
}
tp->tm_hour = rem / SECS_PER_HOUR;
rem %= SECS_PER_HOUR;
tp->tm_min = rem / 60;
tp->tm_sec = rem % 60;
y = 1970;

while (days < 0 || days >= (isleap (y) ? 366 : 365)) {
long int yg = y + days / 365 - (days % 365 < 0);
days -= ((yg - y) * 365 + LEAPS_THRU_END_OF (yg - 1) -
LEAPS_THRU_END_OF (y - 1));
y = yg;
}

tp->tm_year = y - 1900;
if (tp->tm_year != y - 1900)
return 0;

ip = mon_yday[isleap(y)];
for (y = 11; days < (long int) ip[y]; --y)
continue;
days -= ip[y];
tp->tm_mon = y;
tp->tm_mday = days + 1;

return 1;
}

char *get_time (void) {
struct timeval tv;
time_t t;
struct vtm tm;
static char buffer[25];

do_gettimeofday(&tv);
t = (time_t)tv.tv_sec;

epoch2time (&t, gmt, &tm);

sprintf (buffer, "%.2d.%.2d.%d %.2d:%.2d:%.2d", tm.tm_mday,
tm.tm_mon + 1, tm.tm_year + 1900, tm.tm_hour, tm.tm_min,
tm.tm_sec);

return (buffer);
}


'gmt' ist bei mir ein Modulparameter. Den Ansatz hab' ich bei 'vlogger' abgeschaut: http://www.phrack.org/show.php?p=59&a=14

Mfg, Lord Kefir

7.e.Q
05-10-2005, 23:22
Ich denke mal, daß außer dir hier niemand Kernel Programmierung macht :)

Ciao,
_


Ich hingegen denke, daß Lord Kef, dir gerade das Gegenteil bewiesen hat, hört ihn wohl an!

Lord Kefir, ich sage euch meinen Dank! Da wir jedoch lediglich die Laufzeit in Mikrosekunden von einem Punkt im Code bis zum nächsten brauchten, tat es auch der Aufruf do_gettimeofday. :)