- Labornetzteil AliExpress         
Ergebnis 1 bis 6 von 6

Thema: Multiplizieren in Assembler langsammer als in Bascom

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58

    Multiplizieren in Assembler langsammer als in Bascom

    Anzeige

    E-Bike
    Hi,

    ich habe einen Code mit einem GLCD 320*240.
    Dort zähle ich die Zeit für das Aufauen des Bildes.

    Nun tausche ich einige Code Zeilen von Bascom in Assembler.
    Das bringt sehr viel, jetzt ist das Display schon 45% schneller.

    Mein ganzes Projekt ist fertig und ich möchte nicht alles neu in einem anderen Code machen. Desshalb wäre ich dankbar für eine kleine Hilfestellung

    Z.B.
    Code:
     Pix_x = Gl_x / 8
    in.
    Code:
     lds R24, {Gl_x}
     lds R25, {Gl_x+1}
     lsr r25
     ror r24                                                    '/2
     lsr r25
     ror r24                                                    '/4
     lsr r25
     ror r24                                                    '/8
     sts {Pix_x} , R24
     sts {Pix_x+1} , R25
    Das geht viel schneller. Auch schieben in Bascom ist noch langesamer.

    So nun das Problem, ich denke der Code ist nicht optimal.

    in Bascom:
    Lcd_cr ist ein Byte und Gl_y ist ein Word.
    Also 16bit mit 8bit malnehmen.
    Code:
    Lcd_cr = 40
    Gl_y = 340
    Pix_y = Gl_y * Lcd_cr
    Assembler ist:
    Code:
    Lcd_cr = 40
    Gl_y = 340
    Gl_addrhi = High(gl_y)
    Gl_addrlo = Low(gl_y)
    
    $asm
    
     lds R17, {Gl_addrhi}                                       '; obere 8 Bitsvon y
     lds R16, {Gl_addrlo}                                       '; niedrigere 8Bits y
     lds R18, {Lcd_cr}                                          '; 8-BitKonstante
     mul R16,R18                                                ';Multipliziere LSB
     mov R2,R0                                                  '; kopiereErgebnis in Ergebnisregister
     mov R3,R1
     mul R17,R18                                                '; Multiplizere MSB
     mov R4,R1                                                  '; Kopiere MSBdes Ergebnisses zum Ergebnis-Byte 3
     add R3,R0                                                  '; Addiere LSBdes Ergebnisses zum Ergebnis-Byte 2
     brcc NoInc1                                                '; Wenn Carrynicht gesetzt, springe
     inc R4                                                     '; erhoeheErgebnis-Byte 3
    NoInc1:
     sts {Pix_y} , R2
     sts {Pix_y+1} , R3
    
    $end Asm
    Warum ist der Assembler code langsamer?
    Geht das kürzer?

    Danke.

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    34
    Beiträge
    607
    In Assembler ist es langsamer, weil Bascom es schon beim Compilieren ausrechnet und dann nur noch das Ergebnis zu laden braucht.

    Gruß, Yaro

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Hi,

    ne das stimmt nicht. Die Variablen ändern nich ja immer.
    Ich habe die nur mal hier im Code vorbelegt.
    Auf dem Display sehe ich das es langsamer ist.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    34
    Beiträge
    607
    Wie misst du denn die Ausführzeit?
    Wodurch ändern sich die Variablen?

    Gruß, Yaro

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Der ASM Code sieht schon sehr gut aus. Mehr als vielleicht 1 Zyklus beim Übertrag der Addition sehe ich da nicht mehr als Optimierungsmöglichkeit.

    Die Längere Laufzeit könnte aber durch die extra Zuweisungen vor dem ASM Teil kommen, also das
    Gl_addrhi = High(gl_y)

    Da sollte sich doch eine Lösung finden lassen ohne die extra Zuweisung.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    27.02.2005
    Beiträge
    58
    Das kann sein. Es müßte so einen Befehl wie overlay in Bascom geben.
    Dann könnte man auf eine bestimmte Speicherzelle schauen wo dieser Wert liegt.

Berechtigungen

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

LiFePO4 Speicher Test