- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 65

Thema: Bascom Inline-Assembler

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Also, ich habs gerade nochmal probiert:
    Code:
    Config Pind.2 = Input
    Portd.2 = 0
    Config Int0 = Rising
    On Int0 Getreceiver Nosave
    Config Timer0 = Timer , Prescale = 256
    On Timer0 Detectrxpause Nosave                              'timer overflow = pause in receiver's signal
    
    Dim Empf(5) As Byte
    
    ...
    
    Getreceiver:                                                'byte-array, cycles in range: 43, out of range: 28
    !PUSH    R16
    !IN      R16,       SREG
    !PUSH    R16
    !LDS     R16,       {channel}
    !INC     R16
    !STS     {channel}, R16
    !SUBI    R16,       2
    !CPI     R16,       5
    !BRCC    NotInRange
    !PUSH    XL
    !PUSH    XH
    LoadAdr Empf(1) , X
    !ADD     XL,        R16
    !CLR     R16
    !ADC     XH,        R16
    !IN      R16,       TCNT0
    !ST      X,         R16
    !POP     XH
    !POP     XL
    !NotInRange:
    !LDI     R16,       6
    !OUT     TCNT0,     R16
    !POP     R16
    !OUT     SREG,      R16
    !POP     R16
    Return                                                   'that means that there are problems with the receiver
    
    
    Detectrxpause:
    !PUSH    R16
    !IN      R16,       SREG
    !PUSH    R16
    !ldi     R16,       0
    !sts     {channel}, R16
    !POP     R16
    !OUT     SREG,      R16
    !POP     R16
    Return
    Es funktioniert doch, anscheinend hatte ich damals irgendwo einen Fehler...
    Habe jetzt auch den Timer0 Interrupt umgeschrieben, wäre nett, wenn du kurz drüberschauen könntest, obs so passt!? Fliegen tut das ganze
    Meinst du, ich solle jetzt noch die Arrays mit den temporären Variablen verändern? Habs gerade mal probiert, mithilfe der Overlay Funktion würde kein zusätzlicher Speicher verbraucht.
    Code:
    Dim Tmp1 As Byte At Empf(1) Overlay
    Dim Tmp2 As Byte At Empf(2) Overlay
    Dim Tmp3 As Byte At Empf(3) Overlay
    Dim Tmp4 As Byte At Empf(4) Overlay
    Dim Tmp5 As Byte At Empf(5) Overlay
    Außerdem würde ich mir dann die Zuweisung tmpx <--> empf(x) sparen?!
    Hältst du das für sinnvoll?

    Gruß
    Chris

    EDIT:
    Hab gerade folgendes eingefügt:
    Code:
    Dim Tmp1 As Byte At Empf(1) Overlay
    Dim Tmp2 As Byte At Empf(2) Overlay
    Dim Tmp3 As Byte At Empf(3) Overlay
    Dim Tmp4 As Byte At Empf(4) Overlay
    Dim Tmp5 As Byte At Empf(5) Overlay
    Dim Stmp1 As Integer At Sempf(1) Overlay
    Dim Stmp2 As Integer At Sempf(2) Overlay
    Dim Stmp3 As Integer At Sempf(3) Overlay
    Dim Stmp4 As Integer At Sempf(4) Overlay
    Dim Stmp5 As Integer At Sempf(5) Overlay
    Der Code funktioniert. Ich werde jetzt mal im Simulator testen, ob der Code dadurch schneller läuft. Melde mich dann wieder

    EDIT2:
    Hab gerade im Simulator folgendes probiert:
    Code:
    If Sempf(1) > -37 And Sempf(1) < 37 Then
       !nop
    End If
    
    If Stmp1 > -37 And Stmp1 < 37 Then
       !nop
    End If
    Beide IF-Abfragen brauchen incl. dem !Nop genau 34 Takte. Habe ich etwas anderes gemacht, als du gemeint hast oder bringts doch keine Besserung?
    Geändert von Che Guevara (24.12.2011 um 22:09 Uhr)

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Es funktioniert doch, anscheinend hatte ich damals irgendwo einen Fehler...
    Schön
    Habe jetzt auch den Timer0 Interrupt umgeschrieben, wäre nett, wenn du kurz drüberschauen könntest, obs so passt!? Fliegen tut das ganze
    Speziell in diesem Fall kannst Du Dir das Sichern des SREGs sparen, denn weder LDI noch STS verändert das SREG. Würdest Du statt dessen !CLR R16 schreiben, wär's etwas anderes.
    Code:
    Detectrxpause:
    !PUSH    R16
    !LDI     R16,       0
    !STS     {channel}, R16
    !POP     R16
    Return
    Habs gerade mal probiert, mithilfe der Overlay Funktion würde kein zusätzlicher Speicher verbraucht.
    Hältst du das für sinnvoll?
    Ich seh' jetzt nicht so recht, wie Du im gezeigten Noise-Filter Code mit Overlay arbeiten willst.

    Wie sieht's den mit der Aufrufrate dieses Noise-Filter Codes aus ? Normalerweise sind solche Filter an ein Timing gebunden. Oder läuft der da so schnell er kann ?
    Müsstest mal den Code extrahieren und alleine laufen lassen, um zu sehen wie viel Rechenleistung der frisst und ob es lohnt da viel Arbeit reinzustecken.

    Edit:
    Das hier kann der Compiler zur Compilezeit auflösen und es ist deshalb genauso schnell wie die Adressierung einer einzelnen Variable.
    Code:
    If Sempf(1) > -37 And Sempf(1) < 37 Then
    Das kann der Compiler nicht vorher auflösen, da er den Wert von "i" nicht kennt, das kostet mehr Code und Ausführungszeit:
    Code:
    If Sempf(i) > -37 And Sempf(i) < 37 Then

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Ok, habs jetzt ohne Sichern des SREG. Danke!

    Nein, beim Noise-Filter-Code verwende ich die Overlays nicht, da hier die Schleife einfach einfacher ist
    Die Overlays werden nur im restlichen Programm verwendet, z.b. bei den darauffolgenden Zeilen:
    Code:
    If Tmp1 > 61 And Tmp1 < 139 Then                            'don't process values that can't be correct
      Stmp1 = Tmp1 - 61
      Stmp1 = Stmp1 * 3                                         '==> values ranging from 3 (stick at bottom) to 228 (full throttle)
    End If
    'Now nick, roll, yaw and idle up switch
    
    If Tmp3 > 61 And Tmp3 < 139 Then                            'don't process values that can't be correct
      Stmp3 = Tmp3 - 100                                        'convert to values ranging from -37 to +37
    End If
    If Tmp2 > 61 And Tmp2 < 139 Then                            'don't process values that can't be correct
      Stmp2 = Tmp2 - 100                                        'convert to values ranging from -37 to +37
    End If
    If Tmp4 > 61 And Tmp4 < 139 Then                            'don't process values that can't be correct
      Stmp4 = Tmp4 - 100                                        'convert to values ranging from -37 to +37
    End If
    If Tmp5 > 61 And Tmp5 < 139 Then                            'don't process values that can't be correct
      Stmp5 = Tmp5 - 100                                        'convert to values ranging from -37 to +37
    End If
    Hm, also der Code wird so schnell wie möglich aufgerufen:
    Code:
    Do
      Acc
      Gyro
      Mixer
      Send_mots
      Led
      Voltage
      Failsave
      Guiconnection
    Loop
    End
    Die Mixer-Sub beinhaltet den Noise-Filter Code. Meinst du den Filter-Code? Das werde ich gleich mal machen.

    Gruß
    Chris

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Die Mixer-Sub beinhaltet den Noise-Filter Code. Meinst du den Filter-Code?
    Ja, weil man dann sieht, wo's sich lohnt zu optimieren und wo nicht.
    Mein Edit hast Du gelesen ?
    Ob Du über Array(1) oder über Overlay Array(1) adressierst bleibt sich gleich. Nur Array(Variable) = Array(Variable) + andere Variable macht einen deutlichen Unterschied.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Das Edit habe ich gerade eben gelesen. Das leuchtet natürlich ein.
    Was meinst du mit
    Nur Array(Variable) = Array(Variable) + andere Variable macht einen deutlichen Unterschied.
    ?
    Meinst du, dass
    Code:
    Stmp1 = Stmp1 + Tmp1
    schneller als
    Code:
    Sempf(1) = Sempf(1) + Tmp1
    ist?

    Gruß
    Chris

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Meinst du, dass
    Code:
    Stmp1 = Stmp1 + Tmp1
    schneller als
    Code:
    Sempf(1) = Sempf(1) + Tmp1
    ist?
    Nein, gleich schnell.
    Das ist langsamer:
    Code:
     Sempf(i) = Sempf(i) + Tmp1

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Oh, na klar! Du hast es ja vorher schon geschrieben...

    Werde jetzt mal das Programm durchforsten und mal schauen, wo noch was zu machen ist. Melde mich dann wieder.

    Gruß
    Chris

    EDIT:
    Hab jetzt mal den Noise-Filter durch den Simulator gejagt. Herausgekommen ist folgendes:
    Code:
    '(  1439
    For I = 1 To 5
      Meanrx(i) = Meanrx(i) * 3
      Meanrx(i) = Meanrx(i) + Empf(i)                           '"lowpass filter" of the RC signal
      Shift Meanrx(i) , Right , 2                               ' (=divide by 4)
      Aempfh(i) = Meanrx(i) + 17                                'upper acceptable fluctuation
      Aempfl(i) = Meanrx(i) - 17                                'lower acceptable fluctuation
      If Empf(i) > Aempfh(i) Or Empf(i) < Aempfl(i) Then        'compare allowed fluctuation with current rc reading
         Empf(i) = Meanrx(i)                                    'if fluctuation was too high -> replace with averaged value
      End If
    Next
    ')
    
    '(  635
    Meanrx(1) = Meanrx(1) * 3
    Meanrx(1) = Meanrx(1) + Empf(1)
    Shift Meanrx(1) , Right , 2
    Aempfh(1) = Meanrx(1) + 17
    Aempfl(1) = Meanrx(1) - 17
    If Empf(1) > Aempfh(1) Or Empf(1) < Aempfl(1) Then
       Empf(1) = Meanrx(1)
    End If
    
    Meanrx(2) = Meanrx(2) * 3
    Meanrx(2) = Meanrx(2) + Empf(2)
    Shift Meanrx(2) , Right , 2
    Aempfh(2) = Meanrx(2) + 17
    Aempfl(2) = Meanrx(2) - 17
    If Empf(2) > Aempfh(2) Or Empf(2) < Aempfl(2) Then
       Empf(2) = Meanrx(2)
    End If
    
    Meanrx(3) = Meanrx(3) * 3
    Meanrx(3) = Meanrx(3) + Empf(3)
    Shift Meanrx(3) , Right , 2
    Aempfh(3) = Meanrx(3) + 17
    Aempfl(3) = Meanrx(3) - 17
    If Empf(3) > Aempfh(3) Or Empf(3) < Aempfl(3) Then
       Empf(3) = Meanrx(3)
    End If
    
    Meanrx(4) = Meanrx(4) * 3
    Meanrx(4) = Meanrx(4) + Empf(4)
    Shift Meanrx(4) , Right , 2
    Aempfh(4) = Meanrx(4) + 17
    Aempfl(4) = Meanrx(4) - 17
    If Empf(4) > Aempfh(4) Or Empf(4) < Aempfl(4) Then
       Empf(4) = Meanrx(4)
    End If
    
    Meanrx(5) = Meanrx(5) * 3
    Meanrx(5) = Meanrx(5) + Empf(5)
    Shift Meanrx(5) , Right , 2
    Aempfh(5) = Meanrx(5) + 17
    Aempfl(5) = Meanrx(5) - 17
    If Empf(5) > Aempfh(5) Or Empf(5) < Aempfl(5) Then
       Empf(5) = Meanrx(5)
    End If
    ')
    Also 635 im Vergleich zu 1439 ist doch schon etwas
    Vielen Dank für den Tipp!

    Gruß
    Chris

    EDIT:
    Mit den Tmpx-Overlay Variablen von Empf(x) kann man ja, wenn ich jetzt keinen Mist erzähle, die ISR nochmal verkürzen?!
    Code:
    'in range: 33
    'out of range: 34
    
    !PUSH    R16
    !IN      R16,       SREG
    !PUSH    R16
    !PUSH    R18
    
    !in r18, tcnt0
    !lds r16, {channel}
    !cpi r16, 1
    !breq channel1
    !cpi r16, 2
    !breq channel2
    !cpi r16, 3
    !breq channel3
    !cpi r16, 4
    !breq channel4
    !cpi r16, 5
    !breq channel5
    !rjmp outofrange
    Channel1:
    !sts {tmp1}, r18
    !rjmp outofrange
    Channel2:
    !sts {tmp2}, r18
    !rjmp outofrange
    Channel3:
    !sts {tmp3}, r18
    !rjmp outofrange
    Channel4:
    !sts {tmp4}, r18
    !rjmp outofrange
    Channel5:
    !sts {tmp5}, r18
    Outofrange:
    !inc r16
    !sts {channel}, r16
    !LDI     R16,       6
    !OUT     TCNT0,     R16
    
    !POP     R18
    !POP     R16
    !OUT     SREG,      R16
    !POP     R16
    Stimmt das soweit oder fällt dir etwas auf?
    Geändert von Che Guevara (25.12.2011 um 00:06 Uhr)

Ähnliche Themen

  1. Inline Assembler
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 01.02.2010, 19:25
  2. AVR GCC inline Assembler
    Von chientech im Forum Assembler-Programmierung
    Antworten: 1
    Letzter Beitrag: 26.09.2009, 16:39
  3. Inline Assembler für Anfänger
    Von 1udo1 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 25.10.2007, 19:53
  4. Inline Assembler - Register
    Von s.o. im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 02.08.2007, 20:26
  5. Parameterübergabe bei Inline-Assembler
    Von ogni42 im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 30.03.2006, 13:32

Berechtigungen

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

12V Akku bauen