Forum: Mikrocontroller und Digitale Elektronik Globale Variable wird überschrieben


von Hardware I. (bensen83)


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?

von Rene H. (Gast)


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.

von Peter (Gast)


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.

von Thomas W. (thomas100)


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

von Karl H. (kbuchegg)


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!

von Karl H. (kbuchegg)


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!

von Thomas W. (thomas100)


Lesenswert?

ja, stimmt.

typischer copy-and-paste-Fehler.

Danke

von Karl H. (kbuchegg)


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#Globale_Variablen_.C3.BCber_mehrere_Dateien

von Hardware I. (bensen83)


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.

von Oliver (Gast)


Lesenswert?

>allerdings wurde die Variable unter 2 verschiedenen adressen abgelegt

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

Oliver

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.