Forum: Compiler & IDEs Pointer zur Laufzeit auf versch. Strings im Flash setzen


von Der T. (Gast)


Lesenswert?

Hallo!

Hab hier ein Problem, bei dem ich ein bischen auf der Leitung sitze...

Ich habe mehrere Strings im Flash angelegt (a la "const unsigned char
p_text1[] PROGMEM = blablabla")

Um nun einen der Texte auswählen zu können, hätte ich folgendes
vorgehabt: Ich definiere einen Pointer (volatile unsigned char *text),
den ich dann per switch-Anweisung einem Textstring im Flash zuweise.

z.B.

switch (num) {
 case 0: text=p_text1; break;
 case 1: text=p_text2; break;
}

Der erzeugte Code läuft zwar, jedoch der Compiler gibt mir eine Warnung
aus: "warning: assignment discards qualifiers from pointer target
type"

Was will er mir damit sagen oder besser: Was muß ich wie ändern, damit
die Warnung nicht mehr auftritt?

Danke schonmal im Vorraus!

Gruß,
Techniker

von Εrnst B. (ernst)


Lesenswert?

Der Pointer muss als "auf PROGMEM verweisend" deklariert sein, also

volatile PROGMEM unsigned char *text

const sollte er auch noch sein (ist ja nicht veränderbar, auf was er
zeigt) also:

volatile const PROGMEM unsigned char *text


bzw, kürzer:

PGM_P text;

/Ernst

von Der T. (Gast)


Lesenswert?

@Ernst:

Bin leider erst heute dazugekommen, das auszuprobieren!

Wenn ich den Zeiger mit "volatile const PROGMEM unsigned char *text"
deklariere, so sagt mir der Compiler "error: assignment of read-only
variable `text'" und bricht mit Exit Code 2 ab.

Verwende ich jedoch PGM_P, so funktionierts! dummguck

Hab mir dann mal das pgmspace.h angeschaut, aber dort ist auch nix
besonderes gemacht. (oder ich habs übersehen?)

Bin zwar glücklich, dass es mit PGM_P funktioniert, würde die
deklaration aber gerne ausschreiben. :)

Wäre um Tipps sehr dankbar!

Gruß,
Techniker

von Εrnst B. (ernst)


Lesenswert?

Ja, stimmt... der Kompiler wertet das __attribute((_progmem_)) für den
Pointer aus, nicht für den Datentyp auf den der Pointer verweist, will
also den pointer selbst in den progmem packen.


Mit nem Typedef dazwischen gehts:
1
typedef const unsigned char PROGMEM PROGCHAR;
2
PROGCHAR p_text1[]="Blubb";
3
PROGCHAR * test;
4
5
int main(void) {
6
  test=p_text1;
7
...

Dann würd ich aber lieber gleich die vordefinierten Typen aus der
pgmspace.h verwenden...

/Ernst

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.