Hallo Ich bin gerade dabei mir ein Code zu schreiben um text auf ein Display zu schreiben. Es handelt sich um externe fonts die mittels Fontgeneratór erstellt wurden. Soweit geht alles bis auf die Performance. Kann man da noch was Optimieren??
Hier
1 | for( i = 0; i < 8; i++ ) |
2 | {
|
3 | if (c&(128>>i)) |
4 | {
|
5 | GLCD_SetPixel( x1+i, y+j, 1, layer ); |
6 | }
|
7 | else
|
8 | {
|
9 | GLCD_SetPixel( x1+i, y+j, 0, layer ); |
10 | }
|
11 | }
|
steckt noch einiges Potential. Schieben um eine variable Anzahl an Stellen ist immer eine schlechte Idee auf einem AVR. Anstatt mit einer variablen Maske abzufragen, fragst du immer dasselbe Bit ab und schiebst dufür das Byte in c sukzessive um 1 Stelle weiter.
1 | if(font==1) c = pgm_read_byte( &data_table[ offset + o + byteOffset ] ); |
2 | if(font==2) c = pgm_read_byte( &data_table1[ offset + o + byteOffset ] ); |
3 | if(font==3) c = pgm_read_byte( &data_table2[ offset + o + byteOffset ] ); |
schreib dir halt erst mal eine Funktion, die 1 Zeichen ausgeben kann, wobei du die Startadresse im Flash (ergo den Font) dieser Funktion mitgibst. Dann brauchst du nicht bei jedem Zeichen eine Fallunterscheidung machen, welcher Font zu benutzen ist. Die Fontstartadresse stellst du dann 1 mal pro String fest und gibst alle Zeichen mit dieser Fontstartadresse aus. Ausserdem ist so eine Funktion, die 1 Zeichen ausgeben kann, sowieso immer eine gute Idee.
Im Bezug auf die Lesbarkeit könnte man noch optimieren, indem man vernünftig und konsitent einrückt. Das sieht ja aus wie Kraut und Rüben.
Karl Heinz Buchegger schrieb: > Schieben um eine variable Anzahl an > Stellen ist immer eine schlechte Idee auf einem AVR. Das ist aber immer noch um Größenordnungen schneller, als jedes LCD. Außerdem dürfte das allergrößte Optimierungspotential in der Funktion GLCD_SetPixel() stecken. Um welches LCD geht es denn überhaupt? Oliver
>Außerdem dürfte das allergrößte Optimierungspotential in der Funktion >GLCD_SetPixel() stecken. Bzw. diese je nach Position auf dem Display durch das schreiben eines ganzen Bytes zu ersetzen.
Hallo Es geht um ein 320x240 mit Epson S1D13700. Hier ist die SET PIXEL Funktion oid GLCD_SetPixel(unsigned int x,unsigned int y, int color,int layer) { unsigned char tmp = 0; unsigned int address; if(layer==1)address=SED1335_GRAPHICSTART1 + (40 * y) + (x/8); if(layer==2)address=SED1335_GRAPHICSTART2 + (40 * y) + (x/8); if(layer==3)address=SED1335_GRAPHICSTART3 + (40 * y) + (x/8); GLCD_SetCursorAddress(address); GLCD_WriteCommand(SED1335_MREAD); tmp = GLCD_ReadData(); if(color) tmp |= (1 << (SED1335_FX - (x % 8))); else tmp &= ~(1 << (SED1335_FX - (x % 8))); GLCD_SetCursorAddress(address); GLCD_WriteCommand(SED1335_MWRITE); GLCD_WriteData(tmp); } Danke Gruß Paul
Oliver schrieb: > Karl Heinz Buchegger schrieb: >> Schieben um eine variable Anzahl an >> Stellen ist immer eine schlechte Idee auf einem AVR. > > Das ist aber immer noch um Größenordnungen schneller, als jedes LCD. > > Außerdem dürfte das allergrößte Optimierungspotential in der Funktion > GLCD_SetPixel() stecken. Hmm. Da hast du nicht unrecht :-)
Paul schrieb: > > Hier ist die SET PIXEL Funktion Und für bestimmte Werte für x kann man das bei der Textasugabe so optimieren, so dass nicht jedes Pixel einzeln gemalt werden muss, sondern nach Möglichkeit bis zu 8 in einem Rutsch. (wenn ich das richtig sehe, sind immer 8 in x-Richtung nebeneinander liegende Pixel zu einem Byte zusammengefasst) Und wenn es nicht diese bestimmten x-Werte sind, dann kann man die auszugebenden Bytes immer noch in Teile aufteilen, so dass dann trotzdem wieder möglichst viele Pixel in einem Byte in einem Aufwasch geschrieben werden können.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.