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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht 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).

: Bearbeitet durch User
von Bernd K. (prof7bit)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
dankeschön

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.