String Array im Flash einfacher geworden?

OP #1598409
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
#1598417
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|
     +---+---+---+---+---+---+---+---+---+---+---+

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren