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:
Dann eine ISR, die nix macht, ausser eine parameterlose Func zu rufen: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
Der Rahmen ist deutlich fetter, und da sind noch keine Werte übergeben. Ausserdem wird das in jeder ISR wiederholt, die foo() aufruft.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
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
Was fehlt, ist die Unterscheidung, ob ich von INT0 komme oder von INT1...Code:void __attribute__ ((naked)) SIG_INTERRUPT0() { asm volatile ("rjmp __vector_2"); } SIGNAL (SIG_INTERRUPT1) { }
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
dann wird ein Eintrag in die VecTab gemacht!Code:void __vector_10() {}







Zitieren

Lesezeichen