www.mikrocontroller.net

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


Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht far?

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
???

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.