Blame

138850 Bob Green 2026-03-29 13:55:51
1
# Handling Interrupts
2
a3050c Bob Green 2026-03-29 13:57:47
3
This actually is very simple. gcc provides the means to mark a function as an interrupt service routine, namely prefixing a function with `__attribute__(interrupt)`. So, something like this:
4
```c
5
__attribute__((interrupt)) duart_interrupt(void) {
6
/* Handle the interrupt */
3dedcc Bob Green 2026-03-29 14:01:16
7
8
}
a3050c Bob Green 2026-03-29 13:57:47
9
```
3dedcc Bob Green 2026-03-29 14:01:16
10
But there's a macro in `machine.h` to help, so you could replace the above with:
11
```c
12
#include <machine.h>
13
14
ISR duart_interrupt(void) {
15
/* Handle the interrupt */
16
17
}
18
```
19
gcc knows that functions declared using either of the above methods should end with the `rte` rather than `rts` instruction.
d244ca Bob Green 2026-03-29 14:10:12
20
21
## Example
22
```c
23
#include <stdio.h>
24
#include <machine.h>
25
26
static unsigned int ticks = 0;
27
42f951 Bob Green 2026-03-29 14:20:27
28
void twiddle_thumbs(void);
29
d244ca Bob Green 2026-03-29 14:10:12
30
void ISR isr(void) {
31
ticks++;
32
33
*pit_tsr = 1;
34
}
35
36
void scan() {
37
static int lednum = 2;
38
static int delta = 1;
39
42f951 Bob Green 2026-03-29 14:20:27
40
/* create simple visual effect with some of the leds */
d244ca Bob Green 2026-03-29 14:10:12
41
clear_led(lednum);
42
43
lednum += delta;
44
if ((lednum < 2) || (lednum > 7)) {
45
delta = -delta;
46
lednum += delta;
47
lednum += delta;
48
}
49
50
set_led(lednum);
51
}
52
53
int main(void) {
54
unsigned char ivr = *pit_tivr;
55
56
int loop = 0;
57
58
printf("Press any key...\n");
59
60
_pit_set_counter(1000);
61
*pit_tsr = 1;
62
42f951 Bob Green 2026-03-29 14:20:27
63
set_isr_handler(ivr, isr);
d244ca Bob Green 2026-03-29 14:10:12
64
42f951 Bob Green 2026-03-29 14:20:27
65
/* Wait for a keypress */
d244ca Bob Green 2026-03-29 14:10:12
66
while (!_char_available()) {
67
printf("%08x\r", ticks);
68
69
loop++;
70
if (loop == 100) {
71
scan();
72
loop = 0;
73
}
74
}
75
76
_getchar();
77
}
78
```