ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Overflow berechnen | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
14.10.2007, 13:57 Uhr MaikG Posts: 5172 Nutzer |
Gegeben habe ich tv_mics, was ja bei 999999 wieder bei 0 beginnt. Da MaxonBasic ja ohnehin Vorzeichenbehaftete Zahlen verwendet, dachte ich, nimmt man halt den Negativen bereich um das zu kompensieren. Aber bei der Rechnung stimmt was nicht, der Ton hört sich schon ganz gut an aber Teile fehlen sporadisch. Also muss die berechnung falsch sein. code:CONST delaytime%=41 Overflow&=999999-delaytime% Forbid WHILE repeat1&<120001 REM 123 POKEW tr& + tr_node% + IORequestio_Command, TR_GETSYSTIME& junk& = DoIO&(tr&) CopyMem tr& + tr_time%, VARPTR(mytimeval&(0)), 8 a&=mytimeval&(1) IF a&-old&<delaytime% THEN 123 IF a&>Overflow& THEN a&=-(1000000-a&) POKEB MySample&+repeat1&, PEEKB(&hBFE101)-127 INCR repeat1& old&=a& WEND Permit [ - Antworten - Zitieren - Direktlink - ] |
15.10.2007, 09:09 Uhr tboeckel Posts: 124 Nutzer |
@MaikG: Wie wärs mit timer.device/AddTime() oder timer.device/SubTime()? Da werden alle Über- und Unterläufe der Mikrosekunden korrekt in die Sekunden einbezogen. Für genau sowas sind die Funktionen da. [ - Antworten - Zitieren - Direktlink - ] |
15.10.2007, 09:40 Uhr MaikG Posts: 5172 Nutzer |
>Wie wärs mit timer.device/AddTime() oder timer.device/SubTime()? Da werden alle Über- und Unterläufe der Mikrosekunden korrekt in die Sekunden einbezogen. Für genau sowas sind die Funktionen da. Das Prog ist Zeitkritisch und das timer.device im allgemeinen sehr langsam. Legentlich GetSysTime erlaubt ein Timing welches schneller als 12000 HZ ist. [ - Antworten - Zitieren - Direktlink - ] |
15.10.2007, 11:51 Uhr Holger Posts: 8116 Nutzer |
Zitat:...sagt jemand, der CopyMem für 8 bytes aufruft... Ansonsten sieh Dir einfach mal Dein Programm an. Du überprüfst etwas und führst davon abhängig einen Sprungbefehl aus (über ordentliche Schleifenprogrammierung und Poll-Loops wollen wir jetzt mal nicht reden...), und danach überprüfst Du, ob ein Overflow stattgefunden hat. Fällt Dir daran etwas auf? mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
15.10.2007, 14:53 Uhr MaikG Posts: 5172 Nutzer |
>...sagt jemand, der CopyMem für 8 bytes aufruft... Ja okay, das kann man sich wohl auch per peek holen. >Ansonsten sieh Dir einfach mal Dein Programm an. Du überprüfst etwas >und führst davon abhängig einen Sprungbefehl aus Ja. >und danach überprüfst Du, ob ein Overflow stattgefunden hat. >Fällt Dir daran etwas auf? berechnet wird ja ob die neue Variable größer als 999999 werden wird. Ich sehe vom prinzip her keinen Fehler. [ - Antworten - Zitieren - Direktlink - ] |
15.10.2007, 16:17 Uhr tboeckel Posts: 124 Nutzer |
Zitat: AddTime() macht eigentlich nicht mehr als das hier: void AddTime(struct TimeVal *dest, struct TimeVal *src) { dest->tv_sec = dest->tv_sec + src->tv_sec; dest->tv_usec = dest->tv_nsec + src->tv_usec; if (dest->tv_usec >= 1000000) { // Ueberlauf dest->tv_sec = dest->tv_sec + 1; dest->tv_usec = dest->tv_usec - 1000000; } } Analog für SubTime(). Das ist prinzipiell genau das, was du auch mindestens tun mußt. Wenn das bereits zu langsam ist, dann solltest du besser sofort aufhören. Du kannst gerne das Rad zum x-ten Male erfinden, aber deutlich schneller geht es dadurch immer noch nicht. [ - Antworten - Zitieren - Direktlink - ] |
15.10.2007, 18:00 Uhr Holger Posts: 8116 Nutzer |
Zitat:"ob die neue Variable größer als 999999 werden wird"?! Kannst Du hellsehen? Ob die neue Variable, bzw. ihr Inhalt größer als 999999 werden wird, also genaugenommen nicht größer, sondern Dank des Überlaufs wieder nahe 0 sein wird, kannst Du gar nicht wissen. Dazu müsstest Du ja wissen, wie lange der Systemaufruf zur Abfrage der aktuellen Zeit dauern wird. Weniger oder mehr als Deine delaytime%, also 41 µs. Woher willst Du das wissen? Ich sehe "vom Prinzip her" durchaus einen Fehler. Und Du hättest nicht gefragt, wenn Du nicht gewusst hättest, dass da ein Fehler ist. Die korrekte Vorgehensweise ist nunmal, nach der Abfrage anhand des Ergebnisses zu überprüfen, ob ein Überlauf stattgefunden hat. Und dann des Ergebnis zu benutzen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
15.10.2007, 18:50 Uhr MaikG Posts: 5172 Nutzer |
>AddTime() macht eigentlich nicht mehr als das hier: Ja, okay. Bringt aber nichts. Ich rechne MicsA-MicsB. tv_secs ist unbenutzt. 64 Bit Variablen habe ich leider nicht. >berechnet wird ja ob die neue Variable größer als 999999 werden > wird. Ja, nungut also wenn das goto nicht in 1µ abläuft könnte es trotz der prüfung zu einen Overflow kommen. >Die korrekte Vorgehensweise ist nunmal, nach der Abfrage anhand des >Ergebnisses zu überprüfen, ob ein Überlauf stattgefunden hat. >Und dann des Ergebnis zu benutzen. Ich könnte prüfen ob mics <47, aber daraus dann zu berechnen was vor 0 war und auf wieviel ich jetzt noch warten muss dürfte sehr kompliziert sein. [ - Antworten - Zitieren - Direktlink - ] |
16.10.2007, 19:40 Uhr Holger Posts: 8116 Nutzer |
Zitat:Mein Gott, Du rufst eine Funktion auf, die Dir genau zwei Zahlen liefert, Sekunden und Mikrosekunden, und wenn die Zahl der Sekunden größer ist als nach dem letzten Aufruf, hat bei den Mikrosekunden ein Überlauf stattgefunden. Was genau ist daran kompliziert? Du machst es erst kompliziert, in dem Du von der normalen Vorgehensweise, bzw. den nächstliegendsten Dingen abweichst und dann, wenn es nicht funktioniert, noch mehr unsinniges hinzufügst, in der Hoffnung, es irgendwie doch zum Laufen zu bewegen. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Overflow berechnen | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |