- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 57

Thema: Gibt es noch Optimierungspotential? (Mega8 an 320x240 GLCD Textmodus)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von MisterMou Beitrag anzeigen
    Ich glaube nicht, dass da problematische Störungen auftreten, der Mensch ist einfach zu langsam Ich werde es aber mal untersuchen.
    Bis jetzt hattest Du nur statischen Text.
    Das Ergebnis ist zur Zeit 60% Auslastung bei 50Hz und 90% Auslastung bei 75Hz.
    Da wird auch einiges merkwürdiges Zeugs produziert, besonders von der Konstruktion (mFlag<<M) halte ich nichts. Schon mal angesehen, was da selbst in -Os generiert wird ?
    Die Auslastung lässt sich an der Low-Zeit von Pin D0 abschätzen.
    Ich lass mir immer die Takte im Simulator ausgeben.
    Ich bekomme allerdings Grafikfehler bei der -O1 Optimierung, sonst klappt alles.
    Wahrscheinlich optimiert er Dir da irgendetwas weg. Bedeutet das, die höheren Optimierungsstufen funktionieren ?
    Ich programmiere einfach drauf los, Hauptsache ist, dass es funktioniert.
    Da Dein Ziel eine möglichst kurze Ausführungszeit ist, ist ein Einfachfrauflos halt sehr zufällig im Ergebnis.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.05.2009
    Ort
    Stralsund
    Alter
    34
    Beiträge
    436
    Zitat Zitat von MagicWSmoke Beitrag anzeigen
    Bis jetzt hattest Du nur statischen Text.
    Ich seh aber wie träge das Display ist, der Wechsel eins Zeichens dauert mehrere Frames.
    Ich kann Dich aber beruhigen, man sieht keine Probleme, zumindest bei meinem Code. Deiner ist ja fixer, da sollte es weniger Probleme werden.

    Wahrscheinlich optimiert er Dir da irgendetwas weg. Bedeutet das, die höheren Optimierungsstufen funktionieren ?
    Genau, beides.

    Da Dein Ziel eine möglichst kurze Ausführungszeit ist, ist ein Einfachfrauflos halt sehr zufällig im Ergebnis.
    Das ist mir bewusst, aber ich habe kaum Erfahrung. Also erst einmal zum Laufen bringen, dann optimieren. Ich kann ja nicht zaubern
    Geändert von MisterMou (02.05.2012 um 22:07 Uhr)

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Das ist dann das Henne-Ei Paradoxon, wenn Du nicht Assembler lesen kannst, siehst Du nicht, wie der Compiler bestimmte Anweisungen in C umsetzt, das Du deswegen benutzt um Assembler zu vermeiden

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.05.2009
    Ort
    Stralsund
    Alter
    34
    Beiträge
    436
    Da geb ich Dir Recht
    Ich finde ASM einfach so unbequem, aber wo keine Rechenleistung ist, muss man eben durch Optimierung nachhelfen, mir bleibt da wohl nichts übrig...

    Das Ersetzen von (mFlag<<M) durch mFlag bringt so gut wie nichts.
    mFlag wird dabei vorher schon 0x08 oder 0x00 gesetzt.
    Geändert von MisterMou (02.05.2012 um 22:55 Uhr)

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Du hast halt das Problem dass aus 2 schnöden Takten, oft genug durchlaufen, schnell mal 1000 werden.
    Ich fand den erzeugten ASM-Block zum Steuern der Bits unnötig kompliziert, hab' mich allerdings nicht um andere Lösungen umgesehen.

    Mir wär's allerdings zu dumm mit dem C-Code rumtüfteln zu müssen, nur damit der Compiler das von mir Gewünschte zusammenbaut. Hatte ich am Anfang des Projekts auch versucht, nur um zu erkennen, was da alles an kreativ Unbrauchbarem rauskommt.

    Dann sag' ich's doch gleich in Assembler, vor allem da der Umfang der Sache recht überschaubar ist.
    Geändert von MagicWSmoke (02.05.2012 um 23:00 Uhr)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Hab' mir nochmal angesehen, warum Dein Code so langsam ist. Hier:
    ...dass aus 2 schnöden Takten, oft genug durchlaufen, schnell mal 1000 werden.
    hatte ich bereits richtig geraten. Auch wenn ich die (mFlag<<M) Geschichte nicht gut finde, weil er da in einer Schleife schiebt, was völlig unnötig ist, da vermeidbar, so wird dieser Teil nicht oft durchlaufen.

    Das Problem macht dies hier:
    Code:
        mov    r25,r21
        ldi    r24,k00
        subi    r24,k00
        sbci    r25,kFF
    Denn das wird 40 mal pro ISR eingebaut und ist das Resultat aus:
    Code:
    : "r" (&font[charRow][0]), "r" (tempChar) \
    So etwas kannst Du vermeiden, indem Du zu Beginn der ISR die globale Variable in eine lokale kopierst und am Ende wieder zurück. Damit erlaubst Du dem Compiler zu optimieren, d.h. diese lokale Variable in einem Prozessorregister zu halten.
    Code:
        #define char_put() \
    ...
                            : "r" (&font[l_charRow][0]), "r" (tempChar) \
    ...
           }
        
        ISR(TIMER0_OVF_vect)
        {
          unsigned char l_charRow = charRow;
    ...
            if(l_charRow==CHAR_HEIGTH)
    ...
                l_charRow=0;
    ...
            l_charRow++;
              charRow = l_charRow;
        }
    Spart pro ISR-Lauf ca. 160 Takte, macht dann bei 12 x 20 x 75 = ~2900000 Takte
    Geändert von MagicWSmoke (03.05.2012 um 09:19 Uhr)

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.05.2009
    Ort
    Stralsund
    Alter
    34
    Beiträge
    436
    So etwas kannst Du vermeiden, indem Du zu Beginn der ISR die globale Variable in eine lokale kopierst und am Ende wieder zurück. Damit erlaubst Du dem Compiler zu optimieren, d.h. diese lokale Variable in einem Prozessorregister zu halten.
    Um solche Infos geht es mir, danke. Das hatte ich bis jetzt nirgendwo gelesen (vllt. auch überlesen), dabei ist es doch so wichtig für ein schnelles Programm...
    Bin damit auf eine Auslastung von 70% bei 75Hz gefallen, da fehlt nicht mehr viel zur ASM Version
    Bei 50Hz sind es 47% Auslastung.

    Aktueller Stand:
    Angehängte Dateien Angehängte Dateien
    Geändert von MisterMou (03.05.2012 um 10:35 Uhr)

Ähnliche Themen

  1. Zusätzlich zu der M32 noch ein mega8?
    Von AsuroPhilip im Forum Robby RP6
    Antworten: 40
    Letzter Beitrag: 04.11.2011, 10:43
  2. Gibt es noch Realismus im Fernsehen?
    Von HannoHupmann im Forum Offtopic und Community Tratsch
    Antworten: 43
    Letzter Beitrag: 03.08.2011, 14:34
  3. GLCD (GDM12864B) mit KS0108B gibt PixelFehler
    Von SvenS im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 21.04.2011, 10:05
  4. Gibt es noch den Crazy-Car Wettbewerb?
    Von Reinald im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 7
    Letzter Beitrag: 23.10.2008, 11:28
  5. DISAVR - Gibt´s den noch (funktionierend)?
    Von roboguy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 21.09.2005, 22:59

Berechtigungen

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

12V Akku bauen