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?
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.
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
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.
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.
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 ;)
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
also die Variable müsste so oder so global sein, damit das funktioniert oder nicht?
janfl schrieb: > also die Variable müsste so oder so global sein, damit das > funktioniert oder nicht? Welche Variable?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.