mikrocontroller.net

Forum: Compiler & IDEs Array of Structs ins Flash?


Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo AVR Fans!

Erst mal sorry, wenn diese Frage schon mal behandelt wurde, aber ich
find nix, also:
Ich möchte gerne eine Struktur bzw. ein Array davon vollständig im
Flash ablegen. Gut, das ist kein Problem. Jetzt soll die Struktur aber
einen Zeiger auf einen String enthalten, der auch im Flash liegen soll.
Ganz ohne Flash würde sowas aussehen wie folgt:

struct TableEntry
  {
  int v1,v2;
  const char *s;
  };

const struct TableEntry Table[2] =
  {
    { 1,2,"String 1" },
    { 3,4,"String 2" }
  };

hoffentlich stimmt das auch...hab's nur im Kopf compiliert ;-)

Jetzt suche ich die passenden Attribute, damit eben insbesondere auch
die Strings 1. im Flash liegen und 2. in der Struktur auch die
passenden Zeiger ins Flash erzeugt werden. Geht das?

Danke im Voraus

Christian

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht in der FAQ.

http://savannah.nongnu.org/download/avr-libc/doc/a...

Allerdings mußt Du dann halt allen Krempel einzeln aus dem ROM popeln.
Man sollte sich überlegen, wieviel mal man 2-Byte-Pointer im RAM
haben muß/darf/nicht mehr haben darf, damit sich das lohnt.

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,

hab ich soweit verstanden. Es gibt demnach aber keine direkte
Möglichkeit (ohne den Zwischenschritt, einen separaten Zeiger auf den
String zu erzeugen und den in die Struct einzutragen)? Schade, das wird
dann umständlich, da die Struktur bzw. die Tabelle schon ein bissl
länger ist...

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So isses.  Das liegt aber im Wesentlichen an der Harvard-Architektur
selbst.  Andere Compiler verstecken das nur besser, aber realisieren
müssen sie es trotzdem auf gleiche Weise.

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Falls jemandem (ähh mir) diese indirekte Methode zu umständlich ist,
der kann's auch so lösen:

struct TableEntry
  {
  int v1,v2;
  const char s[32];
  };

und wie gehabt:

const struct TableEntry Table[2] =
  {
    { 1,2,"String 1" },
    { 3,4,"String 2" }
  };

mit den entsprechenden PROGMEM-Attributen, und somit liegt tatsächlich
alles im ROM. Der Nachteil dieser Methode ist, daß unabhängig von der
tatsächlichen Stringlänge immer der maximale Platz "verschwendet"
wird.

Jetzt sag bitte niemand: "Achso, ja das hätte ich Dir gleich sagen
können!" :-)

Grüße

Christian

Autor: Peter Fleury (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich fand die Beschreibung über Program Memory String und array im
AVRlibc Manual etwas knapp. Erst nach herumsuchen bin ich auf folgende
Lösung gekommen (siehe Anhang)

Habe Christions erstes Code-Fragment entsprechend vervollständigt.

Braucht neueste Version von pgmspace.h von CVS, hab dieses File dem
Anhang beigefügt, muss ins Verzeichnis \WinAVR\avr\include\avr
kopiert werden.

Getestet mit WinAVR AVR COFF.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wir sind über Änderungswünsche immer erfreut.  Am besten natürlich,
wenn die Änderung gleich beigefügt ist...  Wer kein doxygen
schreiben will, kann's auch als plain text liefern.

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.