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
56b09c Bob Green 2026-03-29 16:06:36
28
ISR isr(void) {
d244ca Bob Green 2026-03-29 14:10:12
29
ticks++;
30
31
*pit_tsr = 1;
32
}
33
34
void scan() {
35
static int lednum = 2;
36
static int delta = 1;
37
42f951 Bob Green 2026-03-29 14:20:27
38
/* create simple visual effect with some of the leds */
d244ca Bob Green 2026-03-29 14:10:12
39
clear_led(lednum);
40
41
lednum += delta;
42
if ((lednum < 2) || (lednum > 7)) {
43
delta = -delta;
44
lednum += delta;
45
lednum += delta;
46
}
47
48
set_led(lednum);
49
}
50
51
int main(void) {
52
unsigned char ivr = *pit_tivr;
53
54
int loop = 0;
55
56
printf("Press any key...\n");
57
58
_pit_set_counter(1000);
59
*pit_tsr = 1;
60
42f951 Bob Green 2026-03-29 14:20:27
61
set_isr_handler(ivr, isr);
d244ca Bob Green 2026-03-29 14:10:12
62
42f951 Bob Green 2026-03-29 14:20:27
63
/* Wait for a keypress */
d244ca Bob Green 2026-03-29 14:10:12
64
while (!_char_available()) {
65
printf("%08x\r", ticks);
66
67
loop++;
68
if (loop == 100) {
69
scan();
70
loop = 0;
71
}
72
}
73
74
_getchar();
75
}
76
```
d544ba Bob Green 2026-04-16 11:20:46
77
78
## Links
79
- [Article on working with interrupts in C.](https://hackaday.io/project/183861-mackerel-68k-linux-sbcs/log/203533-hardware-timers-vectored-interrupts-exception-handling-in-c)