Nicht ganz, das SREG (oder was auch immer) wird nur gerettet, wenn ich der ISR einen Pro/Epilog gebe, was ich aber mit naked verhindern kann.
Zunächst mal eine minimal-ISR, die nix macht:
Code:
SIGNAL (SIG_INTERRUPT1)
{
}
00000060 <__vector_2>:
60: 1f 92 push r1
62: 0f 92 push r0
64: 0f b6 in r0, 0x3f ; 63
66: 0f 92 push r0
68: 11 24 eor r1, r1
6a: 0f 90 pop r0
6c: 0f be out 0x3f, r0 ; 63
6e: 0f 90 pop r0
70: 1f 90 pop r1
72: 18 95 reti
Dann eine ISR, die nix macht, ausser eine parameterlose Func zu rufen:
Code:
SIGNAL (SIG_INTERRUPT1)
{
foo();
}
00000060 <__vector_2>:
60: 1f 92 push r1
62: 0f 92 push r0
64: 0f b6 in r0, 0x3f ; 63
66: 0f 92 push r0
68: 11 24 eor r1, r1
6a: 2f 93 push r18
6c: 3f 93 push r19
6e: 4f 93 push r20
70: 5f 93 push r21
72: 6f 93 push r22
74: 7f 93 push r23
76: 8f 93 push r24
78: 9f 93 push r25
7a: af 93 push r26
7c: bf 93 push r27
7e: ef 93 push r30
80: ff 93 push r31
82: ec df rcall .-40 ; 0x5c
84: ff 91 pop r31
86: ef 91 pop r30
88: bf 91 pop r27
8a: af 91 pop r26
8c: 9f 91 pop r25
8e: 8f 91 pop r24
90: 7f 91 pop r23
92: 6f 91 pop r22
94: 5f 91 pop r21
96: 4f 91 pop r20
98: 3f 91 pop r19
9a: 2f 91 pop r18
9c: 0f 90 pop r0
9e: 0f be out 0x3f, r0 ; 63
a0: 0f 90 pop r0
a2: 1f 90 pop r1
a4: 18 95 reti
Der Rahmen ist deutlich fetter, und da sind noch keine Werte übergeben. Ausserdem wird das in jeder ISR wiederholt, die foo() aufruft.
Was ich gerne hätte, wäre so was:
Code:
0000005e <__vector_1>:
5e: 00 c0 rjmp .+0 ; 0x60
00000060 <__vector_2>:
60: 1f 92 push r1
62: 0f 92 push r0
64: 0f b6 in r0, 0x3f ; 63
66: 0f 92 push r0
68: 11 24 eor r1, r1
6a: 0f 90 pop r0
6c: 0f be out 0x3f, r0 ; 63
6e: 0f 90 pop r0
70: 1f 90 pop r1
72: 18 95 reti
was etwa durch die naked-Sequenz erzeugt wird
Code:
void __attribute__ ((naked))
SIG_INTERRUPT0()
{
asm volatile ("rjmp __vector_2");
}
SIGNAL (SIG_INTERRUPT1)
{
}
Was fehlt, ist die Unterscheidung, ob ich von INT0 komme oder von INT1...
Für den Eintrag in die Vektortabelle ist übrigens nicht das signal- oder interrupt-Attribut verantwortlich, sondern alleine der spezielle Name der Funktion __vector_n, die dem Linker bekannt ist (der Linker weiss eh nix von Attributen). Wenn du also ne Funktion schreibst
Code:
void __vector_10()
{}
dann wird ein Eintrag in die VecTab gemacht!
Lesezeichen