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
#define LEDS1 0xa0
27
#define LEDS2 0x50
28
29
static unsigned int ticks = 0;
30
31
void ISR isr(void) {
32
ticks++;
33
34
*pit_tsr = 1;
35
}
36
37
void scan() {
38
static int lednum = 2;
39
static int delta = 1;
40
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
63
set_isr_vector(ivr, isr);
64
65
while (!_char_available()) {
66
printf("%08x\r", ticks);
67
68
loop++;
69
if (loop == 100) {
70
scan();
71
loop = 0;
72
}
73
}
74
75
_getchar();
76
}
77
```