mikrocontroller.net

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


Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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:
typedef const unsigned char PROGMEM PROGCHAR;
PROGCHAR p_text1[]="Blubb";
PROGCHAR * test;

int main(void) {
  test=p_text1;
...

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

/Ernst

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.