Forum: Mikrocontroller und Digitale Elektronik Probleme mit neuer GNU Toolchain


von Eduard S. (rfk)


Lesenswert?

Heute habe ich eine neue GNU Toolchain für meine ARM7 Microcontroller 
gebaut (gcc-4.4.1, binutils-2.19.1, Target arm-none-eabi, ohne 
newlib/etc.). Dabei habe ich festgestellt, dass globale Deklarationen 
mit Initialisierung nicht mehr funktionieren, wie folgender Beispielcode 
zeigt:

1
typedef struct {
2
  char   *buffer;
3
  size_t size;
4
  size_t position;
5
} Buffer;
6
7
char buf[512] = {0};
8
Buffer b = { buf, 512, 0 };  // Dies scheint nicht zu funktionieren!?
9
10
void main(void) {
11
  // ...
12
13
  /*b.buffer = buf;
14
  b.size = 512;
15
  b.position = 0;*/
16
  //Buffer b = { buf, 512, 0 };
17
18
  b.buffer[0] = 'A';
19
  uartWrite(b.buffer[0]);
20
21
  // ...
22
}

Übersetze ich obigen Code, bleibt der Controller beim Schreibzugriff auf 
b.buffer[0] stehen (wohl weil 'b' nicht initialisiert ist). 
Initialisiere ich 'b' in main() neu (siehe /**/-Kommentar), funktioniert 
es. Auch wenn ich 'b' alternativ als lokale Variable bei der Deklaration 
initialisiere, funktioniert es.

Mit meiner alten Toolchain (gcc-4.0.2, binutils-2.16, Target 
arm-none-eabi, ohne newlib/etc.) und am PC (gcc-4.3.2, binutils-2.18-r3) 
läuft das Snippet natürlich problemlos.

Kann jemand was dazu sagen? Danke vorab.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ist es ein Problem speziell mit der struct oder werden andere DATA 
Variablen ebenfalls falsch initialisiert (z.B. char buf[512] = {1}; geht 
nicht)?

Ich würde zunächst das Anlegen der .data Sektion durch die Toolchain und 
die .data Initialisierung im Startupcode kontrollieren.

von Eduard S. (rfk)


Lesenswert?

Danke für den Hinweis. Dieses Problem betrifft tatsächlich alle globalen 
Variablen, die bei der Deklaration initialisiert werden. Wo vermutest du 
denn den Fehler? Mein Startup-Code sieht soweit korrekt aus und immerhin 
läuft er ja mit der alten Toolchain!? Ich werde mir das Binary mal 
genauer ansehen.

von Eduard S. (rfk)


Lesenswert?

Nach einer Analyse der Binärdatei habe ich das Problem gefunden. Die 
Ursache für die uninitialisierten globalen Variablen war die fehlende 
'eh_frame'-Section des Binaries in meinem Linker-Script, die meine alte 
Toolchain nicht erzeugt. Weitere Informationen dazu suche ich noch.

Immerhin läuft das Programm bisher einwandfrei, nur die folgende Warnung 
von objcopy irritiert mich etwas:

BFD: main.elf: warning: sh_link not set for section `.ARM.exidx'

Kann jemand etwas zu dieser Meldung sagen?

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.