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).