globale Variablen Initialisieren geht nicht?

Gast #1484326
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!
Gast #1484364
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?
Gast #1484439
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
Gast #1485764
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...
Gast #1485956
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren