Hallo, ich habe eine Struktur im PROGMEM definiert. Beim Versuch mit den pgm-Makros darauf zuzugreifen kommt nur Grütze raus. Das Map-file sagt, dass die Struktur im Progmem Data Bereich auf Adresse 0x97b liegt. Wenn ich mir die Stelle im hex-file anschaue, steht da was anderes als meine Struktur. Target ist ein ATmega1281. Hat jemand eine Idee? Gruß Matthias
Hi Nur so aus dem Bauch heraus: Sieh mal im Hexfile auf Adresse 0x1276 nach. MfG Spess
@Spess 0x1276 ist negativ Übrigens bei einer anderen Strukur funktioniert es. So wie es im Map-file steht, finde ich es auch im hex-file wieder. ???
Fehler gefunden! Die Adresse war richtig. Die Grütze war das Problem. Ich habe blind von einem 8051er Code abgeschrieben. Der SDCC kann wohl tatsächlich Strukturarrays mit variablen Stringlängen pro Element verwalten. Der GCC compiliert ohne zu murren, das Ergebnis ist aber undefinierbar. Anbei ein Codeschnipsel zur Verdeutlichung: Original: struct lexcfg { code char *string; void (*function) (uint8_t) ; event_t event; uint8_t button_cfg; }; static code struct lexcfg commandlist[] = { {"NEXT", parse_event, E_NEXT, BUTTON_6 | B_UP}, {"PREVIOUS", parse_event, E_PREV, BUTTON_4 | B_UP}, GCC nimmt es nur so: struct lexcfg { const char string[12]; void (*function) (unsigned char) ; event_t event; uint8_t button_cfg; }; const struct lexcfg commandlist[] PROGMEM = { {"NEXT ", parse_event, E_NEXT, BUTTON_6 | B_UP}, {"PREVIOUS ", parse_event, E_PREV, BUTTON_4 | B_UP}, Gruß Matthias
Matthias Kölling wrote:
> Der GCC compiliert ohne zu murren, das Ergebnis ist aber undefinierbar.
Das Ergebnis ist nicht undefinierbar. Du hast in der Struktur auch
keinen String variabler Länge, sondern einen Pointer auf einen String.
Und da du für diesen String keine spezielle Vorkehrungen getroffen hast,
landet er im RAM. Das Ergebnis ist also ein im RAM liegender String und
eine Struktur im FLASH mit einem Pointer darauf.
Jetzt geht mir ein Licht auf! Das heißt selbst beim Original liegen die Strings nicht im Array sondern irgendwo im Speicher und im Array liegen nur die Pointer darauf. Um also bei mir das gleiche zu bauen, müßte ich die strings noch mal mit PROGMEM vereinbaren. Sehe ich das richtig? Gruß Matthias
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.