mikrocontroller.net

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


Autor: Matthias G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Matthias G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Adrian Maag (maagadrian)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gebhard Raich (geb)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

das Problem ist gelöst.
Da lag ein Fehler in der Entwicklungsumgebung vor. (WINIdea for IfDev)

Danke für eure Hilfe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.