Forum: Compiler & IDEs Frage zur Optimierung Display Text mit Font


von Paul (Gast)


Angehängte Dateien:

Lesenswert?

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??

von Paul (Gast)


Lesenswert?

Hier noch der Code zum Schreiben des Textes

von Paul (Gast)


Angehängte Dateien:

Lesenswert?

Sorry Hier ist der Code

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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.

von Paul (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.