LCD write Data optimieren

Gast #1339516
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?

1
void LCDSetDot(unsigned char x, unsigned char y)
2
{
3
  LCD_GotoXY(x, y);
4
  LCDWriteData(0x80);
5
}
6

7
void LCDWriteData(unsigned char data)
8
{
9
  unsigned char  xOffset;
10
  unsigned short cachePos;
11
  
12
  xOffset = LCDCoord.x % 8;
13
  cachePos = (LCDCoord.y * 30) + LCDCoord.x/8;
14
  lcdcache[cachePos]         |= (data >> xOffset);
15
  lcdcache[cachePos+1]   |= (data << (8-xOffset));
16
  LCDCoord.x += 8;
17
}
Gast
>Wie könnte die LCDWriteData optimiert werden?

Erzeugten Code ansehen und dann entscheiden.
Rechenoperationen vermeiden, die viel Zeit brauchen: MUL + DIV.
Gast
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
Gast
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
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:
1
void LCDSetDot(unsigned char x, unsigned char y)
2
{
3
  unsigned char  xOffset;
4
  unsigned short cachePos;
5
  
6
  xOffset = x % 8;
7
  cachePos = (y * 30) + x/8;
8
  lcdcache[cachePos]         |= (0x80 >> xOffset);
9
  lcdcache[cachePos+1]   |= (0x80 << (8-xOffset));
10
}

Wieso schreibst du eigentlich 2x?
1
  lcdcache[cachePos]         |= (data >> xOffset);
2
  lcdcache[cachePos+1]   |= (data << (8-xOffset));
Gast
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
Persönliche Seite
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.