globale Variablen Initialisieren geht nicht?

Gast #1484326
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
> ... 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 #1484368
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?
Gast #1484439
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
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...
(Firma: Raich Gerätebau & Entwicklung) #1485906
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
Gast #1485956
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.