mikrocontroller.net

Forum: Compiler & IDEs LCD write Data optimieren


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich schreibe meine Daten in einen Cache bevor es aufs Display kommt.
Das Display hat 240 x 160 Pixel.

Um die Geschwindigkeit auzuloten setze ich 38400 mal LCDSetDot und das 
Display ist gefüllt.
Das ist dann die maximale Zeit um eine Displayseite zu beschreiben.
Dauert momentan ca. 800ms.(AVR32 mit 12 Mhz)
Wie könnte die LCDWriteData optimiert werden?

void LCDSetDot(unsigned char x, unsigned char y)
{
  LCD_GotoXY(x, y);
  LCDWriteData(0x80);
}

void LCDWriteData(unsigned char data)
{
  unsigned char  xOffset;
  unsigned short cachePos;
  
  xOffset = LCDCoord.x % 8;
  cachePos = (LCDCoord.y * 30) + LCDCoord.x/8;
  lcdcache[cachePos]         |= (data >> xOffset);
  lcdcache[cachePos+1]   |= (data << (8-xOffset));
  LCDCoord.x += 8;
}

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie könnte die LCDWriteData optimiert werden?

Erzeugten Code ansehen und dann entscheiden.
Rechenoperationen vermeiden, die viel Zeit brauchen: MUL + DIV.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
optimieren könnte man das indem man direkt schreiben könnte
der adresscounter wird beim schreibvorgang ja meist selbst erhöht im LCD 
RAM
also fortlaufende schreiboperationen verwenden ohne jedesmal neu zu 
adressieren

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich mich nicht irre müsste sich %8 durch &0x7 ersetzten lassen. 
Wenn das der Compiler nicht eh schon macht dürfte es was bringen.

Wenn du bischen Cache verschenken kannst, dann lass nach jeder Zeile 
etwas platz. Dann wird aus

cachePos = (LCDCoord.y * 30) + LCDCoord.x/8;

nämlich

cachePos = (LCDCoord.y * 32) + LCDCoord.x/8;

*32 sollte dank Byte-tauschen auch deutlich schneller gehen

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:

> *32 sollte dank Byte-tauschen auch deutlich schneller gehen

Byte tauschen? Da der µC eine Hardwaremultiplikation hat, sollte es egal 
sein, ob man mit 30 oder 32 multipliziert.

@Michael
Wieso teilst du das ganze auf 3 Funktionen auf?

Ich würde das ganze in einer Funktion machen:
void LCDSetDot(unsigned char x, unsigned char y)
{
  unsigned char  xOffset;
  unsigned short cachePos;
  
  xOffset = x % 8;
  cachePos = (y * 30) + x/8;
  lcdcache[cachePos]         |= (0x80 >> xOffset);
  lcdcache[cachePos+1]   |= (0x80 << (8-xOffset));
}

Wieso schreibst du eigentlich 2x?
  lcdcache[cachePos]         |= (data >> xOffset);
  lcdcache[cachePos+1]   |= (data << (8-xOffset));

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Sebastian &0x07 funktioniert, und ist natürlich einiges schneller.

Benedikt:

da hast Du Recht, ich habe das in eine eigene Funtion gepackt.
2 x schreiben war damit ich ein byte an jede Position schreiben kann.
Braucht man bei SetDot dann auch nicht mehr.

Ergebnis: 20% schneller

Viele Grüße
Michael

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Hallo,
>
> Sebastian &0x07 funktioniert, und ist natürlich einiges schneller.

Ehrlich?
Dann solltest du den Optimizer einschalten.

(Oder den Datentyp von LCDCoord.x auf unsigned char ändern)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ja, optimizer war auf 0.

DANKE!!

Autor: Sebastian____ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eigentlich sollte eine komplettes LCD beim vollschreiben weniger als 
100ms benötigen.
Was für einen Controller hat das LCD.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann doch irgendwie nicht sein...

Ich kenne AVR32 nicht, aber bei 12MHz Takt und 38400 Pixeln sind das bei 
der "optimierten" (20% schnelleren) Version 250 Ticks pro Pixel!

Dauern Operationen auf AVR32 wiklich sooo lange?

Datt is doch ne RISC, die ca. 1MIPS/MHz liefern sollte, aber nicht 250 
Ticks für 1 Funktionsaufruf und ne handvoll Trivial-Operationen.

Johann

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.