Forum: Mikrocontroller und Digitale Elektronik globale Variablen Initialisieren geht nicht?


von Matthias G. (Gast)


Lesenswert?

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!

von Klaus (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von tuppes (Gast)


Lesenswert?

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

von tuppes (Gast)


Lesenswert?

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?

von Matthias G. (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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.

von Matthias G. (Gast)


Lesenswert?

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

von Adrian M. (maagadrian)


Lesenswert?

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

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

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

von Matthias G. (Gast)


Lesenswert?

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.

von Matthias G. (Gast)


Lesenswert?

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