mikrocontroller.net

Forum: Compiler & IDEs String-Arrays im Flash-Memory bei AVR-GCC?


Autor: Robert K. (mc1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

zeigt wie man einfache Strings nur Flash verbrauchend ablegt und nutzt.
char StringImFlash[] PROGMEM = "Erwin Lindemann"; // im "Flash"

Ich schaff es jedoch nicht ein String Array abzulegen.

const char *aReg16Names[] PROGMEM = { "abc", "def", "ghi"};
..legt nur die Addressen ab, nicht die Strings o.ä.

const char aReg16Names[][] PROGMEM = { "abc", "def", "ghi"};
.. geht nicht

const char *aReg16Names[] PROGMEM = { PSTR("abc"), "def", "ghi"};
..: "error: braced-group within expression allowed only inside a 
function"

Wie könnte es gehen?


Robert

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> const char aReg16Names[][] PROGMEM = { "abc", "def", "ghi"};
> .. geht nicht
Bei einem zweidimensionalen Array muss mindestens die Spaltenzahl 
angegeben werden.
const char aReg16Names[][4] PROGMEM = { "abc", "def", "ghi"};
geht...

Autor: Robert K. (mc1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
>> const char aReg16Names[][] PROGMEM = { "abc", "def", "ghi"};
>> .. geht nicht
> Bei einem zweidimensionalen Array muss mindestens die Spaltenzahl
> angegeben werden.
>
>
> const char aReg16Names[][4] PROGMEM = { "abc", "def", "ghi"};
> 
> geht...

Es soll kein rechteckiges 2D-Array werden, den die Strings im realen 
Case sind sehr unterschiedlich lang und viele.
Gibts noch eine andere Lösung für freie String-Arrays?

Robert

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

Bewertung
0 lesenswert
nicht lesenswert
Robert K. wrote:

> Es soll kein rechteckiges 2D-Array werden, den die Strings im realen
> Case sind sehr unterschiedlich lang und viele.
> Gibts noch eine andere Lösung für freie String-Arrays?
>
Sicherlich.
const char Str1[] PROGMEM = "String1";
const char Str2[] PROGMEM = "String2";

const char* Strings[] PROGMEM = { Str1, Str2 };

Autor: Robert K. (mc1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
> Robert K. wrote:
>
>> Es soll kein rechteckiges 2D-Array werden, den die Strings im realen
>> Case sind sehr unterschiedlich lang und viele.
>> Gibts noch eine andere Lösung für freie String-Arrays?
>>
> Sicherlich.
>
>
> const char Str1[] PROGMEM = "String1";
> const char Str2[] PROGMEM = "String2";
> 
> const char* Strings[] PROGMEM = { Str1, Str2 };
> 

Danke.  (Da die Tabellen eh von einem Py-Script automatisiert erzeugt 
werden, kann man mit den Hilfsnamen leben ...)

Grüsse
Robert

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde gerne die, wie von Karl Heinz angegebenen, Strings an die LCD 
Lib Funktion von Peter Fleury lcd_puts_p übergeben.

Kann ich dann einfach mit
lcd_puts_p(Strings[1]);

"String2" auf dem Display ausgeben ?

Danke und Gruß
technikus

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

Bewertung
0 lesenswert
nicht lesenswert
technikus schrieb:
> Hallo,
>
> ich würde gerne die, wie von Karl Heinz angegebenen, Strings an die LCD
> Lib Funktion von Peter Fleury lcd_puts_p übergeben.
>
> Kann ich dann einfach mit
>
>
> lcd_puts_p(Strings[1]);
> 
>
> "String2" auf dem Display ausgeben ?

Nein kannst du nicht.
Weil Strings selber wieder ein Array ist (ein Array von Pointern) 
welches im Flash liegt. Und für jede Variable, die im Flash liegt, muss 
der Zugriff über die entsprechenden pgm_readxxx Funktionen gehen.

Allerdings muss das Strings Array ja auch nicht zwingend im Flash 
liegen.

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das String Array würde ich gerne im Flash ablegen, da doch schon einige 
Texte zusammenkommen werfen.

Jetzt finde ich die pgm_read_word Funktion.

Wenn ich richtig verstehe, muss ich mir die Pointeradresse des 
gewünschten Strings aus dem Flash holen. Dann an das LCD übergben ?
    tempString = (const char*)( pgm_read_word( &(Strings[1]) ) );
                lcd_puts(tempString);


Passt das so?

Gruß

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
technikus schrieb:
> Passt das so?

Da tempString auch auch Adressen im Flash verweist, solltest Du 
lcd_puts_p verwenden.

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ich schon 2 Jahre keinen AVR mehr programmiert habe, musste ich erst 
einmal AVR Studio 5 installieren und mein STK500 rauskramen.
Nach ein bißchen Auseinandersetzung mit dem AVR Studio 5 habe ich schon 
einiges weggetippt.


So läuft es:

//Beispiel zur Ausgabe im LCD
int i = 0; //bis i= StringArrayChannelSize...

lcd_puts_p((const char*)( pgm_read_word( &(strarray1[i]) ) ));


//oder

char temp[20];

//Stringarray Inhalt in temp Variable schreiben
strcpy_P(temp, (const char*(pgm_read_word((strarray1[i]) ) ) );
lcd_puts(temp);




DANKE!

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.