
Zitat von
Besserwessi
Mit inline ASM könnte man ggf. noch etwas machen, vor allem beim (temp>>4). Die Funktion könnte man mit dem eher selten genutzten ASM Befehl swap deutlich schneller hinbekommen. Es würde mich wundern wenn der Compiler das erkennt.
Darfst Dich wundern, erkennt er.
Code:
swap r24
andi r24,k0F
out p15,r24
Da die Ausgabe für eine Zeile immer jeweils das erste Byte eines Zeichens, dann nächste Zeile das zweite, usw. ist, wäre eine andere Anordnung des Fonts vorteilhafter, weil dann weniger gerechnet werden müsste. Wenn also die erste Zeile eines beliebigen Zeichens linear über 256 Bytes Programmspeicher ansprechbar ist, fällt die Multiplikation mit 12 weg, die erforderlich ist um an die passende Stelle des Fonts zu gelangen.
Statt
Code:
const unsigned char schrift[256][12] PROGMEM ={
eine Anordnung
Code:
const unsigned char schrift[12][256] PROGMEM ={
Ein
Code:
temp=pgm_read_byte(&schrift[j][text[ln_ctr][row_ctr]]);
würde auf 71,7 Hz kommen. Keine Ahnung ob es sich lohnt die Tabelle dafür umzustellen.
Nachtrag:
Unter der Voraussetzung, dass die Fonttabelle [12][256] lautet, würde dies hier für 78,4 Hz sorgen, Optimierung -Os:
Code:
unsigned char *cptr;
// ...
cptr = &schrift[j][0];
for( unsigned char row_ctr = 0; row_ctr < rows; row_ctr++)
{
temp=pgm_read_byte(cptr + text[ln_ctr][row_ctr]);
// ...
Lesezeichen