mikrocontroller.net

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


Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht 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.htm... wird 
ein Array aus Strings im Flash ja immer zweistufig definiert: erst die 
Strings einzeln und dann das Array.
const char foo[] PROGMEM = "Foo";
const char bar[] PROGMEM = "Bar";

PGM_P array[2] PROGMEM = {
    foo,
    bar
};

Jetzt habe ich es einfach so gemacht
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:
char* tmp2[3];
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

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

Bewertung
0 lesenswert
nicht 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|
     +---+---+---+---+---+---+---+---+---+---+---+

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht 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

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.