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