Forum: Mikrocontroller und Digitale Elektronik Fehler im GCC-Linker?


von Matthias Kölling (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Nur so aus dem Bauch heraus: Sieh mal im Hexfile auf Adresse 0x1276 
nach.

MfG Spess

von Sven P. (Gast)


Lesenswert?

Vielleicht far?

von Matthias Kölling (Gast)


Lesenswert?

@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.
???

von Matthias Kölling (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Matthias Kölling (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.