Hallo!
Jetzt habe ich schon einiges probiert, aber es kommt immer nur Unsinn
bei raus. Mein Ziel ist es Zeichenketten im Flash zu speichern. Die
brauche ich sowohl einzeln, aber auch so, dass ich sie nacheinander
ausgeben lassen kann. Also ein Array von Zeichenketten. Dann könnte ich
myvar[0] ansprechen oder myvar[i] und i laufen lassen.
Im Tutorial steht folgendes für eine einzelne Zeichenkette:
1
constcharmyvar[]PROGMEM="foo";
Meine Versuche, dieses mehrdimensional auszuweiten und zu initialisieren
scheiterten. Ich erspare mir an dieser Stelle Beispiele meiner Ideen,
aber ich erhalte immer den Fehler, dass die Bereiche überlappen.
Wie kann man das machen?
Grüße!
Hi!
Durch diese enorme Beschränkung habe ich mich dafür entschieden ein
Zeigerfeld anzlegen, welches auf meine Konstanten zeigt. Das sieht dann
so aus:
1
#define NBOFCMDS 3
2
constcharcmd_one[]PROGMEM="foo";
3
constcharcmd_two[]PROGMEM="bar";
4
constcharcmd_three[]PROGMEM="foobar";
5
6
constchar*cmd[NBOFCMDS]PROGMEM={
7
cmd_one,
8
cmd_two,
9
cmd_three};
10
11
// In einer Funktion lautet der Aufruf dann z.B.:
12
uart_puts_p((char*)pgm_read_word(cmd+i));
Das klappt auch ganz gut nur denke ich immer noch was falsch gemacht zu
haben. char* im cmd-Array reserviert doch nur 8bit für die Adressen der
Konstanten. Aber was, wenn meine Konstanten nun hinter 0xFF fallen? Ich
bräuchte doch irgendwie uint16_t*, oder?
Auch das Tutorial verstehe ich nicht ganz. Dort steht:
1
Zeiger auf Werte im Flash sind ebenfalls 16 Bits "groß"
2
(Stand avr-gcc 3.4.x).
3
Damit ist der mögliche Speicherbereich für "Flash-Konstanten"
4
auf 64kB begrenzt.
5
6
uint8_t *ptrToArray;
7
[...]
Widerspricht sich das dann nicht anschließend uint8_t* zu nutzen?
Grüße!
Günther Frings wrote:
> Das klappt auch ganz gut nur denke ich immer noch was falsch gemacht zu> haben. char* im cmd-Array reserviert doch nur 8bit für die Adressen der> Konstanten.
Nein.
Der Compiler reserviert soviele Bytes wie er benötigt, um dort
einen Zeiger abzulegen. Das char in char * bedeutet, dass
an der Speicheradresse, auf die der Zeiger hinzeigt, ein char
zu finden ist.
> Aber was, wenn meine Konstanten nun hinter 0xFF fallen? Ich> bräuchte doch irgendwie uint16_t*, oder?
Nein. Du speicherst dort ja keine uint16 ab :-)
Der Compiler weiss schon von sich aus, wieviel Platz er für
einen Zeiger benötigt. Du musst ihm nur noch sagen, worauf
denn der Zeiger zeigt.