Forum: Compiler & IDEs LCD write Data optimieren


von Michael (Gast)


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?

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
}

von Gast (Gast)


Lesenswert?

>Wie könnte die LCDWriteData optimiert werden?

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

von gast (Gast)


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

von Sebastian (Gast)


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

von Benedikt K. (benedikt)


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:
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));

von Michael (Gast)


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

von Karl H. (kbuchegg)


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)

von Michael (Gast)


Lesenswert?

Hallo,

ja, optimizer war auf 0.

DANKE!!

von Sebastian____ (Gast)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.