Hi,
zu 1.1)
"prog_uint8_t" ist eine 8Bit großer Datentyp, der vom Comiler automatisch im Flash abgelegt wird. Die Definition hierfür findet sich in der Datei pgmspace.h:
Code:
typedef uint8_t PROGMEM prog_uint8_t;
Das Attribut PROGMEM sagt dem Compiler, dass er Daten dieses Typs im Flash ablegen soll.
prog_uint8_t * ist nun also ein Pointer auf einen solchen Datentyp und zeigt somit auf eine Adresse im Flash.
Sinn und Zweck: Größere konstante Datenmengen wir z.B. Zeichensätze werden lieber im Flash abgelegt, da die meisten µC deutlich mehr Flash- als RAM-Speicher im Bauch haben.
zu 1.2)
(prog_uint8_t *) ist ein sogennanter Cast, eine Typumwandlung.
Sinn und Zweck: Ich gehe mal davon aus, dass die Variable font ein Integer ist, der einfach die Basisadresse eines Zeichensatzes enthält. Würde man diese Variable nun einfach dem Zeiger fnt zuweisen, würde der Compiler meckern, da diese beiden Datentypen nicht kompatibel sind. Um sie kompatibel zu machen, braucht man den Cast.
zu 2)
fnt ist die Basisadresse des Zeichensatzes. Um nun an das richtige Zeichen zu gelangen, muss ich zu dieser Adresse die "Nummer" des Zeichens c mal die Höhe des Zeichens addieren. Damit habe ich die oberste Zeile des Zeichens. Mit der Addition von fonty erhalte ich dann die weiteren Zeilen.
Ein * ist immer nur dann als Multiplikation zu sehen, wenn es zwischen zwei Variablen bzw. Konstanten steht oder direkt vor einem =.
Ansonsten ist er immer als Verweisoperator (Pointeroperator) zu sehen.
Gruß,
Georg
Lesezeichen