Forum: Compiler & IDEs String Array im Flash einfacher geworden?


von Fabian B. (fabs)


Lesenswert?

Ich wundere mich gerade etwas über die Definition eines Arrays von 
Strings, das komplett im Flash landen soll.

Laut GCC-Tutorial hier oder auch 
http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array wird 
ein Array aus Strings im Flash ja immer zweistufig definiert: erst die 
Strings einzeln und dann das Array.
1
const char foo[] PROGMEM = "Foo";
2
const char bar[] PROGMEM = "Bar";
3
4
PGM_P array[2] PROGMEM = {
5
    foo,
6
    bar
7
};

Jetzt habe ich es einfach so gemacht
1
const char uartCmdTbl[][3] PROGMEM = { "P0", "P1", "P2", "DB"}

Und das landet auch komplett im Flash (laut .lss-File in Section .text). 
Und der Zugriff ist über die _P Funktionen einfach mit z.B. 
uartCmdTbl[3] möglich:
1
char* tmp2[3];
2
strcpy_P(tmp2, uartCmdTbl[3]);

Liegt das jetzt daran, dass alle Strings die gleiche definierte Länge 
haben oder ist das doch irgendwie ganz anders und ich seh's nur nicht?

AVR-Studio 4.16 B628, WinAVR-20090313

Gruß
Fabian

von Karl H. (kbuchegg)


Lesenswert?

Fabian B. schrieb:
> Liegt das jetzt daran, dass alle Strings die gleiche definierte Länge
> haben

Das ist einer der Schlüssel, warum in diesem Fall deine Lösung besser 
ist.

> oder ist das doch irgendwie ganz anders und ich seh's nur nicht?

Die beiden Techniken bauen im Speicher unterschiedliche Strukturen auf.

Die Tutorialvariante baut dieses hier auf


    +---------+                +---+---+---+---+
    |  o---------------------->| F | O | O | \0|
    +---------+                +---+---+---+---+
    |  o---------------+
    +---------+        |
                       |    +---+---+---+---+
                       +--->| B | A | R | \0|
                            +---+---+---+---+

Also: Ein Array von Pointer, wobei jeder Pointer auf einen String zeigt. 
Alle Einzelteile liegen im Flash.
Vorteil: Die Strings können alle unterschiedliche Länge haben, 
verbrauchen dabei aber immer nur soviel Speicher, wie sie tatsächlich 
lang sind.
Nachteil: Ein zusätzliches Array von Pointern

Du hingegen baust ein echtes 2D Array auf


     +---+---+---+
     | P | 0 | \0|
     +---+---+---+
     | P | 1 | \0|
     +---+---+---+
     | P | 2 | \0|
     +---+---+---+
     | D | B | \0|
     +---+---+---+

Vorteil: Die Texte sind kompakt gespeichert.
Nachteil: Ein einziger langer Text sorgt dafür, dass alle anderen Texte 
mit ungenützten Bytes angelegt werden muss

     +---+---+---+---+---+---+---+---+---+---+---+
     | P | 0 | \0|   |   |   |   |   |   |   |   |
     +---+---+---+---+---+---+---+---+---+---+---+
     | P | 1 | \0|   |   |   |   |   |   |   |   |
     +---+---+---+---+---+---+---+---+---+---+---+
     | P | 2 | \0|   |   |   |   |   |   |   |   |
     +---+---+---+---+---+---+---+---+---+---+---+
     | D | B | \0|   |   |   |   |   |   |   |   |
     +---+---+---+---+---+---+---+---+---+---+---+
     | H | a | l | l | o |   | W | e | l | t | \0|
     +---+---+---+---+---+---+---+---+---+---+---+

von Fabian B. (fabs)


Lesenswert?

Oh wunderbar :-)

Da bei mir alle Strings eh die gleiche länge haben (3 Zeichen inkl. \0) 
ist das dann offensichtlich die optimale Lösung.

Gruß
Fabian

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.