Wenn die Anweisungen der Unterfunktion wirklich im ISR ausgeführt werden
müssen und es "nur" um bessere Übersichtlichkeit geht, kann man sich
evtl. mit "inlineing" behelfen. z.B. in der Art:
1 | // file buttons.h
|
2 | #ifndef BUTTONS_H_
|
3 | #define BUTTONS_H_
|
4 |
|
5 | static inline void button1_ISR_callback(void) {
|
6 | // tu dies
|
7 | // tu das
|
8 | }
|
9 |
|
10 | extern void button1_init( unsigned char bini );
|
11 | //...
|
12 | #endif
|
13 |
|
14 | // file leds.h
|
15 | #ifndef LEDS_H_
|
16 | #define LEDS_H_
|
17 |
|
18 | static inline void LED1_ISR_callback(void) {
|
19 | // tu dies
|
20 | // tu das
|
21 | }
|
22 |
|
23 | extern void LED1_init( unsigned char lini );
|
24 | //...
|
25 | #endif
|
26 |
|
27 | // file timebase.c
|
28 | #include "buttons.h"
|
29 | #include "leds.h"
|
30 |
|
31 | //...
|
32 |
|
33 | ISR(welcherauchimmer)
|
34 | {
|
35 | LED1_ISR_callback();
|
36 | button1_ISR_callback();
|
37 | // ...
|
38 | }
|
39 |
|
40 | //...
|
Der Code der Callback-Funktionen wird dann in der ISR eingesetzt und die
Sicherung der Register entfaellt, da es ja keine eigentlichen
Funktionsaufrufe mehr sind, sondern nur eine "Textersetzung".
Evtl. ist je nach Optimierungsmethode ein "force-inline"-attribute fuer
die callbacks notwendig. Habe ich bisher aber noch nicht gebraucht
(avr-gcc 4.1.1, -Os, nur sehr wenige Operationen in den callbacks).
Martin Thomas