Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Im Treiber System Uhr abfragen

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456

    Im Treiber System Uhr abfragen

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Hmm, so 'ne einfache Frage und keiner weiß 'ne Antwort? Hmmmm... egal, hab's inzwischen selbst herausgefunden:

    do_gettimeofday(struct timeval* tv);

    danke trotzdem!

  3. #3
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich denke mal, daß außer dir hier niemand Kernel Programmierung macht

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  4. #4
    Registrierter Benutzer
    Registriert seit
    04.05.2005
    Ort
    Dortmund
    Beiträge
    31
    Habe das in dem LKM an dem ich momentan arbeite so gelöst...

    Du brauchst erst mal folgende Macros und Datentypen:
    Code:
    // 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:
    Code:
    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

  5. #5
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Zitat Zitat von anda_skoa
    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.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •