globale Variablen wo definieren?

Gast #5743750
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.
Gast #5743796
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
Gast #5743808
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.
Moderator Persönliche Seite #5744099
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.
Moderator Persönliche Seite #5744141
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.
Gast #5744175
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren