Forum: Compiler & IDEs 64 bit Timestamp (in ms) in 32 Bit Timestamp (in sec) umwandeln, ohne 64 bit "Operation"


von Stephan S. (stephan_s)


Lesenswert?

Servus!
Ich habe folgendes Problem: ich habe einen 64 Bit Timestamp, den ich in 
einen 32 Bit Timestamp umwandeln möchte. Der 64 Bit ist in Millisekunden 
und der 32 Bit ist in Sekunden. Eigentlich ne einfache aufgabe, jedoch 
bin ich auf nem 8051 unterwegs und kann daher keinn 64 bit verarbeiten! 
Wie kann ich trotzdem den timestamp umwandeln (also durch 1000 teilen)?
Vielen Dank für eure Hilfe!

von No (Gast)


Lesenswert?

Du kannst duch 1024 teilen, durch 1000 teilen wird aufwendig.

von Oliver (Gast)


Lesenswert?

Stephan S. schrieb:
> Eigentlich ne einfache aufgabe

Eben, der Wertebereich der ganzen Sekunden im 64-Bit Timestamp passt 
nämlich nicht in 32-Bit, egal, wie du das auch berechnest.

Oliver

von UR-Schmitt (Gast)


Lesenswert?

No schrieb:
> Du kannst duch 1024 teilen, durch 1000 teilen wird aufwendig.

Na ja wenn das ein Zeitstempel ist der seit dem 1.1.1970 läuft, dann ist 
der Fehler bei gut 42 Jahren grob geschätzt 1 Jahr.
Keine Ahnung ob der Zeitstempel ein Jahr falsch gehen darf.

Man kann auch mit 8 Bit eine 64 Bit Division machen. Dazu dürfte es 
Codebeispiele im Netz geben. Funktioniert im Prinzip wie eine Rechnung 
auf Papier.
Ist halt etwas aufwändiger.

von UR-Schmitt (Gast)


Lesenswert?

Oliver schrieb:
> Eben, der Wertebereich der ganzen Sekunden im 64-Bit Timestamp passt
> nämlich nicht in 32-Bit

Hmm, vom 1.1.1970 sind bis jetzt etwa 1,3x Milliaren Sekunden vergangen 
wenn ich mich nicht verrechnet habe. Sollte also noch passen.
Kommt halt auch auf den Zeitstempel an.

von Stephan S. (stephan_s)


Lesenswert?

der Timer läuft seit Epoch, das hatte ichv ergessen zu sagen...
Aber habe ich eine Lösung gefunden, basieren auf nem look-up table. 
damit habe ich jetzt einen Fehler von ca. 2 sekunden, aber der reicht 
aus.
Danke für eure Anregungen!

von UR-Schmitt (Gast)


Lesenswert?

Stephan S. schrieb:
> der Timer läuft seit Epoch ??

Stephan S. schrieb:
> Aber habe ich eine Lösung gefunden, basieren auf nem look-up table.
Dann lass die die du gefragt hast auch an deiner Lösung teilhaben.

von Rolf Magnus (Gast)


Lesenswert?

UR-Schmitt schrieb:
> Stephan S. schrieb:
>> der Timer läuft seit Epoch ??

http://de.wikipedia.org/wiki/Epoch

von Peter D. (peda)


Lesenswert?

Warum nicht einfach Division, wie man sie in Assembler macht:
64 mal links schieben, testen, abziehen und fertig.

Die 64 Bit übergibt man als 2 * 32Bit:
1
#define uint8_t  unsigned char
2
#define uint16_t unsigned short
3
#define uint32_t unsigned long
4
5
uint32_t div64b_1000( uint32_t high32, uint32_t low32 )
6
{
7
  uint16_t temp = 0;
8
  uint8_t i;
9
10
  for( i = 64; i; i-- ){
11
    temp <<= 1;
12
    if( high32 & 0x80000000 )
13
      temp |= 1;
14
    high32 <<= 1;
15
    if( low32 & 0x80000000 )
16
      high32 |= 1;
17
    low32 <<= 1;
18
    if( temp >= 1000 ){
19
      temp -= 1000;
20
      low32 |= 1;
21
    }
22
  }
23
  return low32;
24
}

Man kann da noch optimieren, z.B. die obersten 2 Byte gleich 
wegschmeißen.


Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.