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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.