STM32 SysTick: Globale Variable

OP #2880625
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
#2880706
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;
OP #2880724
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
#2880732
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.
#2880873
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.
OP #2881780
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.

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