amiga-news 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:
Original von MaikG:
Das Prog ist Zeitkritisch und das timer.device im allgemeinen sehr langsam.

...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:
Das Prog ist Zeitkritisch und das timer.device im allgemeinen
sehr langsam.
Legentlich GetSysTime erlaubt ein Timing welches schneller als
12000 HZ ist.


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:
Original von MaikG:
>> 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.

"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:
Original von MaikG:
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.

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.
.