-         

Ergebnis 1 bis 2 von 2

Thema: FPS-Counter mit undefiniertem Verhalten

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.03.2005
    Ort
    83395 Freilassing
    Beiträge
    5

    FPS-Counter mit undefiniertem Verhalten

    Anzeige

    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

    Code:
    '###################################################
    ' 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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    13.03.2005
    Ort
    83395 Freilassing
    Beiträge
    5
    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?

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •