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
Steht in der FAQ. http://savannah.nongnu.org/download/avr-libc/doc/avr-libc-user-manual/FAQ.html#faq_rom_array 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.
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...
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.