Datentypen u64 und Zeitangabe..



  • Hallo,
    ich will ein Lastmessungsprogramm schreiben, das auf Kernelebene (bzw. in einem Modul) arbeitet.
    Nun will ich die JetztZeit (in mikro/sekunden durch do_gettimeofday(&timevalinstanz)) von der startzeit ((struct task_struct*)->start_time) abziehen.

    Mein Problem ist jetzt, dass wenn ich das voneinander abziehe(oder nur darstelle), oder start_time von tv_sec oder tv_usec nur mist rauskommt, da start_time ein unsigned long long Typ ist, und die anderen nur unsigned long werte, und ich irgendwie keine vernünftigen Werte bekomme.

    Ich wollte *damit* ja eigentlich die generelle Laufzeit des Programms (nicht die Zeit, wo es arbeitet), herausbekommen, nur komme ich auf keinen grünen Zweig.
    Habt ihr ne Idee, wie ich einen oder 2 der Datentypen in ein (gemeinsames) Format konvertieren kann, sodass sich damit arbeiten lässt?



  • unsigned long long erg = start_time - (unsigned long long)foo;
    


  • ja, aber das Problem ist doch, ich muss ja tv_sec - start_time bzw tv_usec - start_time machen ... Aber start_time ist durch die grössere Bitbreite schon viel grösser! (also, nicht automatisch, aber realiter ist die Zahl grösser)



  • Hat start_time Mikrosekunden?

    unsigned long long end_time = (tv.tv_sec * 1000000) + tv.tv_usec
    unsigned long long duration = end_time - start_time;
    

    oder Millisekunden?

    unsigned long long end_time = (tv.tv_sec * 1000) + (tv.tv_usec / 1000)
    unsigned long long duration = end_time - start_time;
    

    Gehts so? 🙂



  • Das wäre das nächste Problem ... Ich will halt die ganze Zeit ein Modul schreiben, mit dem ich das erstmal abschätzen kann, aber das geht auch nicht, denn wenn ich
    tv_sec und tv_usec darstellen will, gibt mir das immer komische Werte aus.
    lt. Kerneldefinition ist beides ein normales long

    typedef long __kernel_time_t
    typedef __kernel_time_t time_t

    typedef long __kernel_suseconds_t
    typedef __kernel_suseconds_t suseconds_t

    Aber wenn ich das mittels %ld beides darstellen will, ist tv_usec in der grössenordnung von tv_sec und meist sogar kleiner *verwirrt*



  • Du weisst schon, dass tv_sec und tv_usec nicht denselben Zeitpunkt in unterschiedlichen Einheiten, sondern einen Zeitpunkt in zwei Fragmenten enthält?

    Wenn tv_sec 12 und tv_usec 563400 ist dann befinden wir uns 12 Sekunden, 563 Millisekunden und 400 Microsekunden vom Epoch entfernt.

    D.h. Dein tv_usec darf gerne kleiner als tv_sec sein. Um genauzusein darf tv_usec alles, nur nicht größer als 1000000 werden, denn das entspräche einer Sekunde und würde in tv_sec gezählt. Der Grund der Aufspaltung: Sehr richtig, die Größe der Datentypen ist schuld dass man das mal so machen musste 🙂



  • Urgs... ich dachte, das wären zueinander äquivalente Werte ....


Anmelden zum Antworten