- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: Geschwindigkeit Division AVR/BASCOM

  1. #21
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.03.2004
    Beiträge
    137
    Anzeige

    Powerstation Test
    dann muss ich wohl doch auf C++ umsatteln.... Gibs da anständige Oberflächen mit Simulator usw? Oder einfach dann das AVR-Studio benutzen?

    Viele Grüsse

    Jan

  2. #22
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Hallo Jan,

    Du kannst das AVR-Studio nur dann benutzen, wenn Du schon WinAVR installiert hast, das es dessen Compiler (AVR-GCC) braucht. AVR-Studio kann aber kein C++ sondern nur C. C++ geht nur mit WinAVR, was aber auch ziemlich gut ist und ausser der Tatsache, dass man die Makefiles selbst erstellen muss, keine anderen Nachteile hat.

    MfG Mark

  3. #23
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.03.2004
    Beiträge
    137
    Moin moin,

    rechnen die C-Varianten denn direkt in den Registern? Oder auch erst aus dem SRAM holen und wieder reinschreiben?

  4. #24
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    AVR rechnet nur im Register
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Hallo Jan,

    wie Vitis bereits gesagt hat, rechnen AVRs nur in Registern. Was bei C-Compilern aber bei eingeschalteter Optimierung anders ist, ist dass sie versuchen, die Werte auch in den Registern zu halten, wenn sie nochmals verwendet werden. Z.B: wenn man sowas hier hat:

    Code:
    a=b+c;
    d=b;
    c=d+a;
    macht Bascom ungefähr folgendes:
    Code:
    //erste zeile
    lds r16,adresse von b //lade r16 mit dem inhalt von b
    lds r17,adresse von c //lade r17 mit dem inhalt von c
    add r16,r17 //addiere r16 und r17, und speichere das erg. in r16
    sts adresse von a,r16 //speichere den inhalt von r16 in a
    
    //zweite zeile
    lds r16,adresse von b //lade r16 mit dem inhalt von b
    sts adresse von d,r16 //speichere r16 in d
    
    //dritte zeile
    lds r16,adresse von d //lade r16 mit dem inhalt von d
    lds r17,adresse von a //lade r17 mit dem inhalt von a
    add r16,r17 //addiere r16 und r17, und speichere das erg. in r16
    sts adresse von c,r16 //speichere den inhalt von r16 in c
    ein guter C-Compiler wie avr-gcc macht aber etwas viel kürzeres:
    Code:
    //erste zeile
    lds r16,adresse von b //lade r16 mit dem inhalt von b
    lds r17,adresse von c //lade r17 mit dem inhalt von c
    add r17,r16 //r17=r16+r17
    sts adresse von a,r17 //speichre r17 in a
    
    //zweite zeile
    sts adresse von d,r16 //speichere r16 in d, da in r16 immer ncoh der inhalt von b ist
    
    //dritte zeile
    add r16,r17 //r16=r16+r17 //da in r17 immer noch a ist und d=b ist 
    sts adresse von c,r16 //c=r16
    So wären es mit Bascom gut 10 Befehle (wahrscheinlich sogar noch mehr), mit avr-gcc mit eingeschaltetem Optimierer aber nur 7. Dementsprechend kann der erzeugte Code beim avr-gcc durchschnittlich gut 1,5-2 mal kleiner sein als in Bascom und wird auch schneller ausgeführt.

    MfG Mark

  6. #26
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.03.2004
    Beiträge
    137
    Atmel hätten den AVR's ruhig ein hardware-divider spendieren können (( Dann wär das alles schonmal fixer... Gibt es ne Möglichkeit in Bascom die Division zu beschleunigen?

  7. #27
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Manche Compiler optimieren die Division durch eine Konstanten, wie zB Division durch 3:

    A = B / 3

    Nehmen wir A und B mal als 8-Bit-Werte, dann ist das (zumindest algebraisch) gleichbedeutend mit.

    A = 256 * B / 3 / 256
    und nach Rundung von 256/3
    A = 85 * B / 256

    Die Multiplikation mit 85 wird dabei als 8*8=16 ausgeführt und vom Produkt die obersten 8 Bits als Ergebnis genommen.

    Das geht schneller, weil Multiplikation und oberen Teil verwenden weitaus billiger ist als ne Division (zumindest für AVR).

    Sowas kann man auch händisch hinschreiben. Allerdings können sich die Ergebnisse von A div 3 und 85*A div 256 wegen der Rundung um 1 unterscheiden.

    Hier (für 3) bekommt man Gleichheit so:

    A div 3 = 85*(A+1) div 256
    Disclaimer: none. Sue me.

  8. #28
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.03.2004
    Beiträge
    137
    so, hab angefangen einige Routinen etwas zu optimieren )... im echten Code ist A natürlich eine errechnete Variable ...

    immerhin habe ich es geschafft, dass der Code 5x schneller läuft....

    Dim A As Word
    Dim B As Word
    Dim C As Word

    A= 25000

    'Beispiel 1 (braucht 282 Takte):
    B=A/10
    c=B*15

    ' Beispiel 2 (braucht 56 Takte):

    B = A
    Shift A , Right , 1
    C = B + A


    ' Beispiel 3 (braucht 37 Takte):

    C = A * 1.5

    C ist dann allerdings 50000 nicht 37500...


    ' Beispiel 4 (656 Takte!!!!)

    C = A * 1.5

    C ist diesmal ne Single-Variable....


    man kann da also doch noch ne Menge optimieren In diesem Fall ist die Shift-Methode auf jedenfall die richtige!

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Labornetzteil AliExpress