mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Globale Variable wird überschrieben


Autor: Hardware Interrupt (bensen83)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute ich habe einen PIC24HJ128GP506 und definiere mir in einer 
Headerdatei wie folgt eine globale Variable:

//########## Globale Variablen ##########
  static uint8 mode;
  static uint8 direction;

in einer initfunktion gebe ich ihnen dann die einmaligen startwerte:


void initVariables(void){
mode = 'P';
direction = 'u';
}

habe dann mit include die oben genannte Headerdatei in die inte´rrupts.c 
eingebunden. Wenn ich jetzt jedoch einen interrupt vom Timer bekomme und 
das Programm in die ISR springt, dann steht in meinen beiden Variablen 
jeweils. '.'  drin. wo kommt das her? kennt das jemand?

Autor: Rene H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit dem Code Fragment kann man nichts sagen, aber das klingt danach das 
eine Poninter ins Juhee zeigt und der Speicher da überschrieben wird.

Wann wird die init Funktion aufgerufen? Kann auch ein Timing Problem 
sein.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder die variablen sind mehrfach vorhanden (Header aus mehre quellen 
verwendet).

Am besten die Variablen in einer C Datei anlege, und in der header 
extern reinschreiben.

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist doch klar.
In jedem C-File, in dem du deinen Header einziehst, wird die Variable 
neu erzeugt.

Du musst deine Variable einmal im Programm definieren und einen Wert 
zuweisen.

static uint8 mode = 'P';
static uint8 direction= 'u';


In deinen anderen Dateien kannst du dann mit

extern static uint8;
extern static uint8 direction;


auf deine Variablen zugreifen.

Thomas

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine sog. 'globalen Variablen' sind in Wirklichkeit keine.
Besorg dir bitte ein C-Buch und mach dich schlau, was mit dem 
Schlüsselwort 'static' ausgedrückt wird.

In deinem Programm existieren 2 Variablen namens "mode".
Eine in der Source Code Datei, in der auch die Funktion initVariables 
enthalten ist. Und eine 2-te in der Source Code Datei in der deine ISR 
enthalten ist.

Und wenn du deine Headerdatei in noch 5 andere C-Dateienb inkludierst, 
bekommt jede einzelne dieser C-Dateien ihren eigenen Satz an 
File-globalen Variablen namens mode bzw. direction.

File-global!  aber nicht  Programm-global!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Weyhrauch schrieb:
>
> static uint8 mode = 'P';
> static uint8 direction= 'u';
>
>
> In deinen anderen Dateien kannst du dann mit Du musst dann mit
>
> extern static uint8;
> extern static uint8 direction;
>
>
> auf deine Variablen zugreifen.

Das wird nicht gehen.
Das 'static' muss weg!

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, stimmt.

typischer copy-and-paste-Fehler.

Danke

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ein Artikel, wie das mit globalen Variablen wirklich funktioniert, 
und wie man das bei Headerfiles macht, findet sich in der FAQ

http://www.mikrocontroller.net/articles/FAQ#Global...

Autor: Hardware Interrupt (bensen83)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo war kein Copy aste fehler oder so. ich habe die header datei auch 
so geöffnet, dass keien variablen mehrfach deklariert wurden, allerdings 
wurde die Variable unter 2 verschiedenen adressen abgelegt, habe es 
jetgzt mit ner externen deklaration gemacht und es funktioniert.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>allerdings wurde die Variable unter 2 verschiedenen adressen abgelegt

Genau das ist der Sinn von "static" - je source-file eine eigene 
Adresse.

Oliver

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.