Forum: Mikrocontroller und Digitale Elektronik STM32 SysTick: Globale Variable


von Patrick B. (p51d)


Lesenswert?

Hallo miteinander

Ich habe mitlerweile begonnen mich ein wenig in die ARM-Welt 
einzuarbeiten. Ebenfalls bin ich schon auf die ersten Hürden gestossen.
Ich möchte den SysTick als Zeitbasis benutzen, aber leider schaffe ich 
es irgendwie nicht.
Im main.c möchte ich auf die Variable zugreifen, welche im 
stm32f4xx_it.c inkrementiert wird.

Dabei kann ich irgendwie nicht auf die Variable zugreifen, welche 
entweder in main.c / main.h / stm32f4xxit.c oder in stm32f4xx_it.h 
deklariert und initialisiert habe. In jeweils einem der beiden Files ist 
die Variable anschliessend nicht bekannt.
Was mache ich falsch?

Variable wird so initialisiert:
1
volatile static uint32_t systick_ticks = 0;

Besten Dank für die Hilfe
MFG
Patrick

von Jan H. (jan_h74) Flattr this


Lesenswert?

In main soll diese variable auch noch "extern" declariert werden. Damit 
weiss der Compiler das es sich um eine globale variabele geht, und 
kansst du auch dort zugreifen.
In *it.c wird das dan :  volatile static uint32_t systick_ticks = 0;
In main wird das dan  : extern uint32_t systick_ticks;

von Patrick B. (p51d)


Lesenswert?

Danke für die Antwort.
Ok, habe ich jetzt versucht:

main.c
1
extern uint32_t systick_ticks;
2
3
if(systick_ticks >= 200){
4
  GPIOD->ODR ^= LED_orange | LED_red | LED_green | LED_blue;
5
  systick_ticks = 0;
6
}

stm32f4xx_it.c
1
volatile static uint32_t systick_ticks = 0;

Ergibt folgender Fehler:
1
src\main.o: In function `main':
2
C:\Users\Patrick\Atollic\TrueSTUDIO\ARM_workspace\test1\Debug/..\src/main.c:104: undefined reference to `systick_ticks'
3
C:\Users\Patrick\Atollic\TrueSTUDIO\ARM_workspace\test1\Debug/..\src/main.c:104: undefined reference to `systick_ticks'
4
C:\Users\Patrick\Atollic\TrueSTUDIO\ARM_workspace\test1\Debug/..\src/main.c:106: undefined reference to `systick_ticks'
5
C:\Users\Patrick\Atollic\TrueSTUDIO\ARM_workspace\test1\Debug/..\src/main.c:106: undefined reference to `systick_ticks'
6
collect2: ld returned 1 exit status

MFG
Patrick

von (prx) A. K. (prx)


Lesenswert?

Patrick B. schrieb:
> volatile static uint32_t systick_ticks = 0;

Lass das static weg.

von (prx) A. K. (prx)


Lesenswert?

Jan H. schrieb:
> In main soll diese variable auch noch "extern" declariert werden. Damit
> weiss der Compiler das es sich um eine globale variabele geht, und
> kansst du auch dort zugreifen.
> In *it.c wird das dan :  volatile static uint32_t systick_ticks = 0;
> In main wird das dan  : extern uint32_t systick_ticks;

Das wär mal ein Thema fürs Nachsitzen.

Ausserdem sollte man über Include-Files gehen.

von Patrick B. (p51d)


Lesenswert?

Danke, jetzt funktioniert es.

Was ist der Unterschied, dass es ohne "static" funktioniert?

MFG

von (prx) A. K. (prx)


Lesenswert?

Da möchte ich dann doch auf ein C Handbuch verweisen. Da hast du 
letztlich mehr davon.

von Jan H. (jan_h74) Flattr this


Lesenswert?

Static wird nur verwendet wan eine lokale variabele seine Wert behalten 
soll. Eine globale variabele ist sowieso immer "static".
A.K. Schrieb :
>Ausserdem sollte man über Include-Files gehen.
Muss dan in .c oder in .h die Variabele declariert werden ?

von (prx) A. K. (prx)


Lesenswert?

Jan H. schrieb:
> Eine globale variabele ist sowieso immer "static".

Nein. Globale Variable sind nie "static", weil "static" ausserhalb von 
Funktionen so ungefähr das Gegenteil von "global" darstellt. Global 
heisst: Der Name ist über den Quelltext eines .c Files hinaus bekannt.

"static" hat netterweise 2 recht verschiedene Bedeutungen, was zur 
Verwirrung beiträgt. Innerhalb von Funktionen ändert es nichts am 
Namescope, sondern beschreibt es die Art der Allokation. Ausserhalb von 
Funktionen ändert es nichts an der Allokation, sondern reduziert den 
Namescope von global auf File, d.h. der Name ist ausserhalb des Files 
nicht bekannt.

Dass man gerne "static storage" als Bezeichnung für feste 
Speicherallokation verwendet macht die Sache nicht einfacher.

> Muss dan in .c oder in .h die Variabele declariert werden ?

In .h deklariert, in einem .c definiert.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Patrick B. schrieb:
> Ich möchte den SysTick als Zeitbasis benutzen, aber leider schaffe ich
> es irgendwie nicht.

Ich geb dir mal ein Beispiel aus einem meiner Bastelprojekte. Macht 
(wenn ich mich recht erinnere) einen Tick von 10 ms auf.

W.S.

von (prx) A. K. (prx)


Lesenswert?

W.S. schrieb:
> Ich geb dir mal ein Beispiel aus einem meiner Bastelprojekte. Macht
> (wenn ich mich recht erinnere) einen Tick von 10 ms auf.

Du hast da nicht zufällig ein paar "volatile"s vergessen?

von Jürgen (Gast)


Lesenswert?

Am besten läßt du das so und benutzt zum Zugriff eine Funktion.
Globale Variablen sollte man möglichst vermeiden.

von Patrick B. (p51d)


Lesenswert?

Jürgen schrieb:
> Am besten läßt du das so und benutzt zum Zugriff eine Funktion.
Bei den 8-Bitter wurde mir immer von den damaligen Lehrern beigebracht, 
dass Funktionen nichts in einer ISR zu suchen haben, da die SIR so kurz 
wie möglich gehalten werden soll. Und ein Funktionsaufruf ist viel 
umfangreicher als nur eine Variable setzen, inkrementieren oder 
dekrementieren.

Aber ich lasse mich gerne eines Besseren belehren.

> Globale Variablen sollte man möglichst vermeiden.
Dem stimme ich zu, aber leider kann ich nie ganz ohne globale Variablen 
auskomen, da immer irgendetwas in anderen Funktionen benötigt wird, 
wodurch die Variable mindestens im ganzen c-File bekannt sein muss.

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.