Forum: Mikrocontroller und Digitale Elektronik AVR String-Array


von Thommy (Gast)


Lesenswert?

Moinsens allerseits,

beim Aufräumen meines Programmcodes sollte auch ein String-Array 
(beinhaltet ein haufen an Strings) vom RAM in den Flash verbannt werden, 
was allerdings zu einigen Problemen führte.

Im RAM hat dieses Array folgende Gestalt:
1
static const char * sentence_Array[NSENTENCES][NLANGUAGES] = {
2
{"Willkommen", "Welcome"},
3
{"Satz1","Satz2"}
4
};

Um das Array in den Flash zu verschieben wird folgende Darstellung 
verwendet:
1
static const PGM_P sentence_Array[NSENTENCES][NLANGUAGES] PROGMEM = {
2
{"Willkommen", "Welcome"},
3
{"Satz1","Satz2"}
4
};
im LSS-File wird jedoch deutlich, dass der Compiler für jedes 
Array-Element nur einen Zeiger speichert (wie erwartet), welcher auf 
einen "Nichtverwendeten Bereich" im Flashspeicher zielt.
Die Strings an sich werden von Compiler in keiner Weise im Flash 
abgelegt.

Eine mögliche aber unkomfortable Lösung wäre jeden String einzelnd zu 
Deklarieren und die jeweilige Adresse im Array zu speichern:
1
const char T1[] PROGMEM = "Willkommen";
2
const char T2[] PROGMEM = "Welcome";
3
const char T3[] PROGMEM = "Satz1";
4
const char T4[] PROGMEM = "Satz2";
5
static const PGM_P sentence_Array[NSENTENCES][NLANGUAGES] PROGMEM = {
6
{T1, T2},
7
{T3, T4}
8
};

Gibts da eine bessere Möglichkeit, so dass man nicht erst jeden String 
einzelnden Deklarieren muss ???

Bin da für Ratschläge jeder Art offen;)

Gruß Thommy

von Uwe (de0508)


Lesenswert?

Hallo,

ich habe mir einige (zwei) Macros erstellt:
a) das den |const char #NAME# [] PROGMEM| String definiert und b) nur 
den Namen des PROGMEM Strings liefert.

Damit wird der Code sehr übersichtlich.

.

von Stephan (Gast)


Lesenswert?

Hi,
schon mal mit "PSTR()" im Array versucht?

Hab gerade keine Möglichkeit dies zu testen, aber da es beim printf auch 
so geht sollte es möglich sein.

Stephan

von Thommy (Gast)


Lesenswert?

@Uwe S.
sowas in der Art ging mir auch schon durch den Kopf, allerdings ist das 
ganze direkt in einer Tabelle übersichtlicher und schnell erweiterbar.

@Stephan
dies funktioniert leider nicht, da
1
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
aus 2 Codezeilen besteht, welche natürlich nicht im Array verwendet 
werden können.

Wahrscheinlich wirds drauf hinaußlaufen, dass ich die Strings in einer 
Excell-Datei verwalte und zum Erzeugen des Codes für die Strings ein 
kleines Skript verwende.

Aber Weiter Ideen oder Anregungen sind herzlich willkommen

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.