STM32 Interrupt Routine: Zugriff auf Variable in anderer Datei

Gast #6557756
Lesenswert?

Hallo. Ich habe ein Problem mit den Interrupts beim STM32F3. Ich benutze 
die HAL. Die Interrupt-Mehtode befindet sich in 'stm32f3xx_it.c'. Und 
auch dort ist Platz für die Userroutine vorgesehen ('/* USER CODE BEGIN 
EXTI4_IRQn 0 */'). Jetzt möchte ich auf (globale) Variablen (genau 
genommen möchte ich den aktuellen Zählerstand eines Zählers abfragen zum 
Eintreffen) in Datei 'main.c' zugreifen. Wie mache ich das?
Danke euch.
Gast #6557763
Lesenswert?

Das Zauberwort dazu ist "extern". Wahrscheinlich willst du sie außerdem 
als "volatile" deklarieren.

Ich persönlich bevorzuge, die Zugriffe auf solche variablen indirekt 
über getter und setter Funktionen zu kapseln. Diese können in einer 
Header Datei bekannt gemacht werden, die ich überall includiere, wo ich 
sie brauche.

void getLastCommand(char* returnBuffer, int bufSize);
void setLastCommand(char* command);

Solche Dateien heißen typischerweise globals.h und globals.c.

Mache Dir Gedanken über die Tücken der Nebenläufigkeit. Wenn das z.B. 
eine Zeichenkette ist, könnte der Interrupt sie verändern während sie 
vom Hauptprogramm gelesen wird (oder umgekehrt). Lösungsansätze findest 
du, wenn du nach den Stichwörtern "mutex atomic locks" suchst.
Gast #6557769
Lesenswert?

Das Problem ist, dass die Variablen im automatisch generierten Bereich 
der Datei liegen und ich diesen zwar verändern kann, aber bei einer 
erneuten Code-Generierung wieder verschwunden sind. Das würde ich gerne 
vermeiden. :/
Gast #6557774
Lesenswert?

Daniel schrieb:
> Das Problem ist, dass die Variablen im automatisch generierten
> Bereich
> der Datei liegen und ich diesen zwar verändern kann, aber bei einer
> erneuten Code-Generierung wieder verschwunden sind. Das würde ich gerne
> vermeiden. :/

Na und? Das kollidiert weder mit gettern/settern noch mit Zugriff über 
extern deklarationen.
Gast #6557985
Lesenswert?

Daniel schrieb:
> Jetzt möchte ich auf (globale) Variablen (genau
> genommen möchte ich den aktuellen Zählerstand eines Zählers abfragen zum
> Eintreffen) in Datei 'main.c' zugreifen. Wie mache ich das?

Normalerweise schreibt man solche Dinge wie einen Zählerstand nicht in 
main hinein, sondern in den zuständigen Handler, der sich ohnehin um 
diese Variable kümmert. Dann schreibt man deren Bezeichnung mit "extern" 
in die zugehörige .h hinein, von wo man sie problemlos woanders 
inkludieren kann.

Theoretisch könnte man auch eine main.h schreiben, aber ich empfinde 
sowas als recht unschön. Hat man sowas nötig, dann zeugt dies von 
ungünstiger Konstruktion der Firmware.

W.S.
Gast #6558222
Lesenswert?

W.S. schrieb:
> Theoretisch könnte man auch eine main.h schreiben, aber ich empfinde
> sowas als recht unschön. Hat man sowas nötig, dann zeugt dies von
> ungünstiger Konstruktion der Firmware.
>
> W.S.

Das Problem ist das Template des Generators. Somit ist die Dateistruktur 
bis auf die eigenen Dateien vorgegeben. Und in main.c befinden sich alle 
Handles, Initialisierungen und eben auch die main(); Ich meine dass man 
früher seine Interruptroutinen selbst schreiben konnte/ musste, aktuell 
sind diese aber sogar schon definiert, wennauch leer.

Stefan ⛄ F. schrieb:
> Kann man nicht so pauschal sagen. Es birgt auf jeden Fall das Risiko,
> dass man den Überblick verliert, was jetzt wo "zu hause" ist und wer wie
> darauf zugreift.

Das ist auch so mein Gedanke. Aber Danke, deine Lösung ist so perfekt 
wie einfach.

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