Hallo zusammen, ich habe folgendes Problem zu dem ich in diesem Forum nichts finden kann und auch keine weiteren Ideen wo ich suchen muss. Wenn ich Variablen global in einer C-Datei (global.c) deklariere und direkt initialisiere (unsigned int counter_reset = 100;) und diese in der global.h mit extern bekannt mache (extern unsigned int counter_reset;) und sie im main verwende ist sie mit 0 initialisiert! Woran kann es liegen? Includiert ist die Datei? Ich verwenden einen LPC Controller und den GCC Compiler! Vielen Dank für eure Infos!
Die Theorie, wie du sie beschrieben hast ist richtig. Und meine Glaskugel ist in Reparatur, desswegen kann ich leider auch nix zu deinem Code sagen.
Matthias G. schrieb:
> Ich verwenden einen LPC Controller und den GCC Compiler!
Dann kontrolliere mal Startup-Code und Linker-Script, denn darin sollten
die initialisierten Daten aus dem Flash ins RAM kopiert werden.
> ... und sie im main verwende ist sie mit 0 initialisiert! Woher weißt du, dass es so ist? > Woran kann es liegen? Gibts eine lokale Variable gleichen Namens, die die globale verdeckt? Gibts mehrere globale Objekte mit gleichem Namen? Gibts irgendwelche Meldungen vom Linker?
Was passiert zwischen dem Programmstart und der Stelle, wo die Variable den Wert 0 hat? Kann es sein, dass falscher Code (Stichwort wilder Pointer) den Speicher überschreibt?
Danke für die vielen Antworten. Der Variablennamen ist einmalig. Woher ich es weiß das sie mit 0 initialisiert wurde? Debuggen und Schleife im Programm mit LED blinken! Es gibt auch keine Linker Fehlermeldungen. Ich kontrolliere mal den Startup. Danke
Matthias G. schrieb: > Woher ich es weiß das sie mit 0 initialisiert wurde? > Debuggen und Schleife im Programm mit LED blinken! Hört sich superfischig an. Quellcode wäre wirklich nützlich. Ist aber deine freie Entscheidung.
Hier dann einmal das Linker Script: Ich bhabe es mit weiteren verglichen, der Teil der "data section which is used for initialized data" ist identisch, obwohl ich hier das Problem suche. _TEXT_START_ = 0x00000200; _DATA_START_ = 0x40000000; SECTIONS { /* Read-only sections, merged into text segment */ .text0 0x0: { *startup.o(.text) } .text2 _TEXT_START_ : { *(.text) *(.text.*) } /* .rodata section used for read only data (constants) */ . = ALIGN (4); .rodata : { *(.rodata) *(.rodata.*) } . = ALIGN (4); _etext = . ; PROVIDE (etext = .); /*data section which is used for initialized data*/ .data _DATA_START_ : AT (_etext) { _data = . ; *(.data) *(.data.*) SORT(CONSTRUCTORS) } . = ALIGN(4); _edata = . ; PROVIDE (edata = .); .bss : { _bss_start_ = . ; *(.bss) *(.bss.*) *(COMMON) } . = ALIGN(4); _bss_end_ = . ; _end = . ; PROVIDE (end = .); } Vielleicht sieht ja jemand den Fehler...
Hast du noch den Code oder irgend etwas in diese Richtung? Welches File hast du wo und in welchem eingebunden und in welcher Reihenfolge? Mfg, Adrian
Das Initialisieren der globalen Variable kann der Optimierungswut des GCC Compilers anheim gefallen sein, wenn diese nicht als volatile definiert wird und für den Compiler nutzlos erscheint. Grüße
Hallo, die globalen Variablen sind als "volatile" initialisiert. Eine Optimierungsstufe ist nicht aktiv. Wenn ich mir den Hex Code anschaue, läd er im startup code an der Stelle wo er die Initialisierten Daten kopieren sollte die `xFF´ in die Variable. An der Stelle ließt er im ROM am Ende des abgelegten Codes, da steht auch nur 0xFF drin.(debuggt) Woher sollte der Startup Code wissen, wo die globalen initialisierten variablen liegen. # Relocate .data section (Copy from ROM to RAM) LDR R1, =_etext LDR R2, =_data LDR R3, =_edata /* _fine_data */ LoopRel: CMP R2, R3 LDRLO R0, [R1], #4 STRLO R0, [R2], #4 BLO LoopRel _etext = 0x00024EB8 //am Ende des Codes im ROM _data = 0xFF; //da steht wohl der gelesene Wert drin _edata = 0x40000064 //ab 0x40000000 ist RAM und die 64 ist die gesamte Länge der globalen Variablen.
Hallo nochmal, das Problem ist gelöst. Da lag ein Fehler in der Entwicklungsumgebung vor. (WINIdea for IfDev) Danke für eure Hilfe
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.