mikrocontroller.net

Forum: Compiler & IDEs Pointer im Flash auf String im Flash


Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo werte Leidensgenossen,

Ich bin seit ein paar Stunden auf der Suche nach der Lösung eines 
Problems, dass ich anscheinend allein nicht bewältigen kann. Deshalb 
wende ich mich an euch. Für ein graphisches Display mit vielen Menues 
und Texten suche ich eine Möglichkeit im Flash eines Atmegas eine 
Adresstabelle anzulegen, deren Inhalt auf Strings zeigen soll, die 
ebenfalls im Flash liegen bleiben sollen.

Wenn eine solche Tabelle im Ram anlegen möchte kenn ich diese 
Möglichkeit:

char* foo[] = {"Menue1","Menue2",...};

Hier wird eine Tabelle im Ram ezeugt die auf die Strings im Ram zeigt. 
Wenn ich dieses auf den Flash portiere, mit:

char* foo_flash[] PROGMEM = {"Menue1","Menue2",...};

habe ich nach langem probieren herausgefunden, dass eine Tabelle im 
Flash erzeugt wird, deren Inhalte aber immernoch nur auf die Adressen 
der Strings im Ram verweisen.

Meine Frage: Gibt es eine Möglichkeit dem Compiler bzw Linker zu sagen, 
dass die Tabelle sowie die Strings im Flash abgelegt werden sollen??

Vielen Dank,
Benny.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char MenuText1[] PROGMEM = "Menu1";
char MenuText2[] PROGMEM = "Menu2";

char* foo_flash[] PROGMEM = { MenuText1, MenuText2 };

Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das die einzigste sicherste Möglichkeit oder gibt es ggf. noch eine 
weitere Möglichkeit nach dem o.g. Schema im ersten Beitrag vorzugehen?

Mit freundlichen Grüßen.

PS: Ich erlaube mir die Frage, weil es bei der Fülle an Texten einen 
erheblicheren Mehraufwand bedeuten würde und ich über jede Verkürzung 
sehr froh wäre. Es handelt sich um die 50 Strings...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char* foo_flash[] PROGMEM = { PSTR( "Menu1" ),
                              PSTR( "Menu2" ) };

müste auch gehen, bin mir aber nicht 100% sicher

Kennst du:
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
>
> char* foo_flash[] PROGMEM = { PSTR( "Menu1" ),
>                               PSTR( "Menu2" ) };
> 
>
> müste auch gehen, bin mir aber nicht 100% sicher

Nein, das PSTR-Makro funktioniert nicht in Initialisierungslisten.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn deine alle ungefähr gleich lan sind könnte folgendes helfen:
char foo_flash[][10] PROGMEM = { 
  "Menu1",
  "Menu2", 
};

mfg

Daniel

Autor: ben.pu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann hab ich leider noch kein Array mit deren Pointern im Flash :-)
Ich werd aber mal Probieren was drauß zu machen...
MFG Benny.

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier doch mal
const char* const foo_flash[] = { /* ... */ }

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.