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.