PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FPS-Counter mit undefiniertem Verhalten



Species8372
28.10.2007, 17:10
Hallo,

ich habe in mein Programm einen FPS-Counter eingebaut, um die Auswirkung von neuem Code/neuen Routinen/neuen Libs auf die Performance gleich ablesen zu können. Eigentlich kein schwieriges Unterfangen, sollte man meinen. Ich habe den Timer so eingestellt, daß er mit 16bit-Timer bei 16MHz alle 200ms in den Interrupt verzweigt und die "Frames" alle 5 Durchläufe ausgegeben werden. Damit ich weiß, ob überhaupt der Interrupt richtig funktioniert hab ich auch noch ein wenig Sound ausgegeben (ohne Sound-Funktion identisches Verhalten). Die Ausgabe erfolgt nun über RS232.

Das Problem ist folgendes: Es wird einige Sekunden das wohl richtige Ergebnis gezeigt, dann plötzlich ein Wert, der genau doppelt oder drei bzw. viermal so groß ist.
Was ich schon Probiert habe, um das Problem zu lösen: Stack/Framesize geändert. Erzeugen des Ergebnisses in der Interruptroutine (ich brauche später einen String für I2C). Entfernen aller waits/anderer Bibliotheken.

Übrig geblieben ist folgender Code, der jedoch immer noch dieses komische Verhalten zeigt. Als ob beim Sprung in die Interruptroutine die Fpsc-Variable um 1 nach links geshiftet würde....

Falls jemand eine Idee hat, warum ich hier so gewaltig auf dem Holzweg bin, wäre ich sehr dankbar.

Grüße

Species8372



'################################################# ##
' FPS Counter
'################################################# ######



$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64


$crystal = 16000000 'Quarzfrequenz
$baud = 38400


Wait 1
Dim Fpsstr As String * 7

Config Timer1 = Timer , Prescale = 64
Const Timervorgabe = 15536 '65536 (16Bit)-$crystal/Prescale

Dim Fpsc As Long
Dim Timeslice As Byte
Dim Displayed As Byte

Timeslice = 0
On Timer1 Timer_irq
Enable Timer1

Enable Interrupts
Do

If Timeslice = 0 Then
If Displayed = 0 Then
Displayed = 1
Print Fpsstr
End If
End If

If Timeslice <> 5 Then
Incr Fpsc
End If

Loop

End


'Pro 200ms ein Aufruf
Timer_irq:
'DBG
Timer1 = Timervorgabe
Incr Timeslice
If Timeslice <> 5 Then
Sound Portd.7 , 100 , 1
End If
If Timeslice = 5 Then
Fpsstr = Str(fpsc)
Fpsc = 0
Displayed = 0
Timeslice = 0
Sound Portd.7 , 100 , 10
End If

Return

Species8372
02.11.2007, 15:35
Ich habe nun die Variable

Dim Fpsc As Long

in zwei Integer fpsc1 und fpsc2 aufgeteilt. Wenn fpsc1 10 erreicht wird fpsc2 inkrementiert. Bei der Ausgabe wird fpsc2 * 10 genommen. Ergebnis: Der "FPS"-Counter funktioniert wunderbar. Bei meiner Anwendung erreiche ich 225600-225700 durchläufe der Hauptschleife pro Sekunde.

Fazit: Irgendetwas scheint bei der Stackverarbeitung von Long-Variablen nicht immer 100%ig zu funktionieren. Hat jemand anders evtl ein ähnliches Verhalten erlebt? Das sollte dann doch evtl. als BASCOM-Bug vermerkt werden?