- 12V Akku mit 280 Ah bauen         
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
    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

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

  3. #3
    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)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Mit den Tmpx-Overlay Variablen von Empf(x) kann man ja, wenn ich jetzt keinen Mist erzähle, die ISR nochmal verkürzen?!
    Das was Du machst, nennt sich Code-Unrolling, hilft Dir hier aber nicht viel.

    Ich messe so, dass ich 'nen Haltepunkt auf die Gosub und dann auf dem Gosub nächsten Befehl setze, vorher die Zyklen auf 0 setze und dann beim zweiten Haltepunkt ablese, da kommt bei Deinem ungerollten Code raus:
    41, 36, 38, 40, 42, 42 Takte
    Bei einem out of range und 5 in range sind das Gesamt 239, mein letzter Code war 43 x 5 + 28 = 243. Viel hast Du nicht gewonnen, außer Erfahrung

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hm, ok... Aber Erfahrung ist ja auch sehr viel Wert!
    Und meinen Code verstehe ich wenigstens zu 100%.

    Ich werde jetzt noch alle > durch >= austauschen, das bringt auch noch ein paar Takte
    Fällt dir sonst noch ein BASCOM-typischer Taktfresser ein, den ich vermeiden könnte?

    Gruß
    Chris

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Che Guevara Beitrag anzeigen
    Ich werde jetzt noch alle > durch >= austauschen, das bringt auch noch ein paar Takte
    Hast Du Dir das auch im Disassembler auch mal angesehen ?
    Fällt dir sonst noch ein BASCOM-typischer Taktfresser ein, den ich vermeiden könnte?
    Berechnungen in Schleifen, Multiplikationen, Divisionen. Wenn ich 'nen Blick auf den gesamten Code werfen würde, könnt' ich vielleicht noch etwas sehen. Aber heut nicht mehr, wird jetzt Zeit Schluss zu machen, hab' morgen Einiges zu erledigen.
    In der Zwischenzeit viel Spaß beim Kürzen und vor allem nicht zuviel auf einmal

    Ludwig

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    32
    Beiträge
    1.578
    Hm nein, habe ich nicht. Aber ich weiß, dass es keinen ASM Befehl für > gibt, nur für >=. Somit sollte doch auch in Bascom ein >= kürzer sein, oder nicht? Ich werds mir mal disassembliert ansehen...

    Berechnungen in Schleifen gibts keine mehr, die einzige war glaube ich der Noise-Filter. Multiplikationen gibts schon einige, die meisten mit Single Variablen. Das ist zu hoch für mich.
    Divisionen sind fast alle durch die Singles vermieden, lediglich ein paar Integer / Word Divisionen gibt es. Aber es sind nicht sehr viele.

    Ja, ist e schon relativ spät. Vielen Dank schonmal für all deine Bemühungen

    Gruß
    Chris

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

fchao-Sinus-Wechselrichter AliExpress