Forum: Mikrocontroller und Digitale Elektronik Interrupts bei ARM (STM32F1)


von Stefan F. (Gast)


Lesenswert?

Hallo,
ich hab eine Verständnisfrage zum Startup-Code. Auszug daraus:
1
.global  Default_Handler
2
3
Default_Handler:
4
Infinite_Loop:
5
  b  Infinite_Loop
6
7
g_pfnVectors:
8
  .word  _estack
9
  .word  Reset_Handler
10
  .word  NMI_Handler
11
  .word  HardFault_Handler
12
  .word  MemManage_Handler
13
  .word  BusFault_Handler
14
  .word  UsageFault_Handler
15
  .word  0
16
  .word  0
17
  .word  0
18
  .word  0
19
  .word  SVC_Handler
20
  .word  DebugMon_Handler
21
  .word  0
22
  .word  PendSV_Handler
23
  .word  SysTick_Handler
24
        .word  0
25
  .word  0
26
  .word  0
27
  .word  0
28
        ...
29
30
.weak  SysTick_Handler
31
  .thumb_set SysTick_Handler,Default_Handler

Ich lese an diesem Code ab, dass der SysTick Timer die Funktion 
SysTick_Handler aufruft, welche wiederum auf den Default_Handler gemappt 
ist, der sich in einer Endlosschleife aufhängt.

Um einen Systemtimer zu implementieren, muss ich nur eine simple 
C-Funktion schreiben, ist das richtig?:
1
volatile uint32_t systick_count=0;
2
3
void SysTick_Handler(void)
4
{
5
    systick_count++;
6
}

Dass heisst, dass alleine die Existenz dieser C Funktion das Mapping von 
SysTick_Handler zum Default_Handler ersetzt. Ist das richtig?

Ich möchte irgendeinen Hardware-Interrupt in C implementieren. Muss ich 
dann dem Vorbild vom SysTick Timer folgen (mit dem Default-Handler) oder 
kann ich Anstelle von ".word  0" direkt den Namen der C-Funktion 
angeben?

Wie muss die Syntax dazu aussehen und wie sorge ich dafür, dass das Bit 
0 der Sprungadresse immer gesetzt ist, um anzuzeigen, dass ich den Thumb 
Befehlssatz nutze?

Ich merke gerade, dass meine Assembler Kenntnisse total eingerostet sind 
(stammen aus 8051 Zeiten).

von Bernd K. (prof7bit)


Lesenswert?

Stefan U. schrieb:
> Dass heisst, dass alleine die Existenz dieser C Funktion das Mapping von
> SysTick_Handler zum Default_Handler ersetzt. Ist das richtig?

Ja. Dafür daß der Mechanismus funktioniert sorgt das "weak", der Linker 
(welcher letztendlich den Gesamtüberblick hat)  sieht das und verwirft 
die schwache definition und ersetzt sie mit der ersten starken mit 
selbem Namen die er irgendwo findet und trägt ihre Adresse an deren 
Stelle dort ein.

> Ich möchte irgendeinen Hardware-Interrupt in C implementieren. Muss ich
> dann dem Vorbild vom SysTick Timer folgen (mit dem Default-Handler)

Ja.

> oder
> kann ich Anstelle von ".word  0" direkt den Namen der C-Funktion
> angeben?

Das .word 0 oben ist nur in der Spalte verrutscht, es gehört nicht mehr 
zum Systick Eintrag.

Lass den Startup code und diese Tabelle wie sie ist und verwende den 
weak mechanismus wie oben beschrieben: Für jeden Interrupt den Du 
implementieren willst definierst Du einfach eine Funktion exakt gleichen 
Namens irgendwo in Deinem Projekt, der Linker wird das sehen und 
entsprechend berücksichtigen.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

dankeschön

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.