Forum: Mikrocontroller und Digitale Elektronik STM32 Interrupt Routine: Zugriff auf Variable in anderer Datei


von Daniel (Gast)


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.

von Stefan F. (Gast)


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.

von Daniel (Gast)


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. :/

von Stefan F. (Gast)


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.

von Daniel (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Na und? Das kollidiert weder mit gettern/settern noch mit Zugriff über
> extern deklarationen.

Da hast du nat Recht. Ich denke mit extern ist der Zugriff schneller, 
daher werde ich es so lösen. Danke! Ist so eine Art des Zugriffs eig 
good practice?

von Stefan F. (Gast)


Lesenswert?

Daniel schrieb:
> Ist so eine Art des Zugriffs eig good practice?

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.

von W.S. (Gast)


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.

von Daniel (Gast)


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.

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.