Forum: Mikrocontroller und Digitale Elektronik globale Variablen wo definieren?


von leontra (Gast)


Lesenswert?

Hallo, es geht um die Programmierung eines STM-Boards.
In welcher von CubeMX erstellten Datei muss ich denn globale Variablen 
definieren, sodass auch die Interruptfunktionen wie IRQ_Handler darauf 
Zugriff haben?

von Stefan F. (Gast)


Lesenswert?

leontra schrieb:
> Hallo, es geht um die Programmierung eines STM-Boards.
> In welcher von CubeMX erstellten Datei muss ich denn globale Variablen
> definieren, sodass auch die Interruptfunktionen wie IRQ_Handler darauf
> Zugriff haben?

Da gibt es keine feste Vorgabe. Du könntest eine global.c erstellen wo 
sie zuhause sind und in den anderen *.c Dateien benutzt du das 
Schlüsselwort "extern".

Oder zu erstellst dazu passend noch eine global.h die du in alle anderen 
*.c Dateien einbindest.

von leontra (Gast)


Lesenswert?

Schreibt mal bitte genau, was in Main-und Header-Datei stehen muss.

Ich habe eine Header-Datei erstellt mit

#ifndef GLOBAL_H_
#define GLOBAL_H_

#ifdef MAIN
#define EXT
#else
#define EXT extern
#endif

extern short globale_start;

#endif /* GLOBAL_H_ */


und eine c.-Datei mit


#include "global.h"

short gobale_start=0;



Ich brauche die Variable eigentlich nur in der Main.c und in der 
stm32xx_it.c -Datei.

Wenn ich die "global.c" Datei bei beiden includiere (bei der main vorher 
noch #define MAIN), dann kommen beim Kompilieren in der stm32xx_it.c- 
Datei lauter Fehlermeldungen an Stellen, die ich überhaupt nicht 
angerührt habe (z.B. "erwarte ; oder _attribute")

Da stimmt was nicht

von Peter S. (Gast)


Lesenswert?

Man kann die Variable z.B. in dem Modul definieren, dem sie thematisch 
angehört. Im Header-File dieses Moduls wird die Variable dann öffentlich 
bekannt gemacht.
Das Modul mit der ISR muss das Header-File dann inkludieren.

von Mitllesa (Gast)


Lesenswert?

leontra schrieb:
> Ich brauche die Variable eigentlich nur in der Main.c und in der
> stm32xx_it.c -Datei.

In der stm32xx_it.c tut man nichts ändern tun. Nein das
tut man nicht!

Wer so anfängt hat es später total verkackt.

von leontra (Gast)


Lesenswert?

ich schreibe in die it- Datei ja nur meine Interrupt-ISR in die 
IQR-Handler-Funktion.
Und genau da brauche ich auch meine globale Variable ;)

von Bernd K. (prof7bit)


Lesenswert?

leontra schrieb:
> ich schreibe in die it- Datei ja nur meine Interrupt-ISR in die
> IQR-Handler-Funktion.

Warum ausgerechnet dort hinein?

Warum machst Du es nicht so wie es normalerweise vorgesehen ist und 
implementierst die dafür vorgesehenen Hook-Funktionen der HAL?

: Bearbeitet durch User
von janfl (Gast)


Lesenswert?

also die Variable müsste so oder so global sein, damit das funktioniert 
oder nicht?

von Stefan F. (Gast)


Lesenswert?

janfl schrieb:
> also die Variable müsste so oder so global sein, damit das
> funktioniert oder nicht?

Welche Variable?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

leontra schrieb:
> #ifdef MAIN
> #define EXT
> #else
> #define EXT extern
> #endif

Dieser Präprozessor-Trick ist dafür gedacht, dass man globale Variablen 
sowohl

  - global definieren
  - global extern deklarieren

kann. Dann muss man das nicht doppelt machen.

> extern short globale_start;

Wenn Du obigen Trick tatsächluch nutzen willst, dann musst Du 
stattdessen schreiben:
1
EXT short globale_start;

Dann wird sie, wenn Du die Header-Datei in main.c einbindest, definiert, 
denn EXT wird eliminiert und das Ergebnis des Preprocessors ist:
1
short globale_start;

In jeder anderen C-Datei, wo Du den Header einbindest, wird daraus:
1
extern short globale_start;

> und eine c.-Datei mit
>
> #include "global.h"
>
> short gobale_start=0;

Die zweite Zeile ist überflüssig, wenn Du den Preprocessor-Trick mit 
"EXT" verwendest.

Aber noch zur Initialisierung: Globale Variablen sind sowieso mit 0 
initialisiert. Hier kannst Du die Zuweisung mit 0 weglassen. Wenn Du 
tatsächlich einen abweichenden Initialwert verwenden willst, dann musst 
Du die Preprocessor-Makros erweitern, nämlich:
1
#ifdef MAIN
2
#define EXT
3
#define E_INIT(x) = (x)
4
#else
5
#define EXT extern
6
#define E_INIT(x)
7
#endif
8
9
EXT short gobale_start E_INIT(123);

Die Ersetzung der Makros "im Kopf" überlasse ich jetzt mal Dir.

ABER:

Der EXT-Trick ist ziemlich schmutzig und ist nur für ganz faule, aber 
fortgeschrittene Programmierer gedacht. Der Vorteil ist hier, dass man 
sowohl für Definition und Deklaration nur eine Zeile braucht.

Klassisch macht man das so:

global.h:
1
extern short globale_start;   // Deklaration

main.c:
1
#include "global.h"
2
short globale_start = 0;     // Definition

alle_anderen.c:
1
#include "global.h"

Die Makros fallen hier weg, man muss aber alle Variablen doppelt 
angeben, sowohl einmal als Definition und einmal als Deklaration.

Ich empfehle Dir gerade als Anfänger den klassischen Weg. Das andere ist 
für Fortgeschrittene, die genau wissen, was da passiert.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

leontra schrieb:
> ich schreibe in die it- Datei ja nur meine Interrupt-ISR in die
> IQR-Handler-Funktion.

Wie oben schon geschrieben: gehört da nicht rein. C-Module in der LIB 
sollten nicht geändert werden, höchstens, wenn da ein dicker Bug drin 
ist.

Schreib die ISR in main.c

> Und genau da brauche ich auch meine globale Variable ;)

Vorsicht: Variablen, die Du in einer ISR ausliest oder veränderst, 
müssen volatile definiert sein.

Dir fehlen elementare Grundlagen. Du solltest erst einmal mit kleineren 
Projekten beginnen.

von janfl (Gast)


Lesenswert?

naja der Rest des Projektes ist bereits erledigt, es muss jetzt nur noch 
diese globale Variable eingefügt werden. ;)

Also schreibe ich in die c. datei bei der Definition "volatile short 
name_variable"?

Diese Variable wird im Programm selbst nur ein einziges Mal verändert 
und wird erst wieder durch den Reset-Taster auf dem Board auf 0 
zurückgesetzt.

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.