Fehler im GCC-Linker?

Gast #1226602
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
Gast #1226626
@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.
???
Gast #1226873
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
#1226883
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.
Gast #1226889
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.