Das push muss doch vor dem ldi stehen, sonst zerstört die ISR R24. Ausserdem "weiß" GCC nicht, welche Register eine Funktion verwendet, bzw. es wird davon ausgegangen, daß die Werte in R18-R27 und Z zerstört werden (siehe Registerverwendung).
Jedenfalls scheint das ganze komplizierter zu sein, als es auf den ersten Blick erscheint...
So könnte es gehen, zumindest für 2 ISRs:
Das ergibtCode:// Jump to Symbol sym #define jump(sym) \ __asm__ __volatile ("rjmp " #sym) // Set T-Flag #define set() \ __asm__ __volatile ("set") // Clear T-Flag #define clt() \ __asm__ __volatile ("clt") // Load Bit n with T-Flag #define bld(n) \ ({ \ unsigned char _x; \ __asm__ __volatile ("bld %0, %1" : "=r" (_x) : "M" (n)); \ _x & (1 << (n)); \ }) char blah; SIGNAL (foo) { if (bld(0) & 1) blah = 1; else blah = -1; } void __attribute__ ((naked)) SIG_INTERRUPT0() { clt(); jump (foo); } void __attribute__ ((naked)) SIG_INTERRUPT1() { set(); jump (foo); }
Das geht aber nur mit 2 ISRsCode:0000005c <foo>: 5c: 1f 92 push r1 5e: 0f 92 push r0 60: 0f b6 in r0, 0x3f ; 63 62: 0f 92 push r0 64: 11 24 eor r1, r1 66: 8f 93 push r24 ;;;;;;;;;;;;; Prolog Ende 68: 80 f9 bld r24, 0 6a: 80 ff sbrs r24, 0 6c: 02 c0 rjmp .+4 ; 0x72 6e: 81 e0 ldi r24, 0x01 ; 1 70: 01 c0 rjmp .+2 ; 0x74 72: 8f ef ldi r24, 0xFF ; 255 74: 80 93 7b 00 sts 0x007B, r24 ;;;;;;;;;;;;; Epilog Anfang 78: 8f 91 pop r24 7a: 0f 90 pop r0 7c: 0f be out 0x3f, r0 ; 63 7e: 0f 90 pop r0 80: 1f 90 pop r1 82: 18 95 reti 00000084 <__vector_1>: 84: e8 94 clt 86: ea cf rjmp .-44 ; 0x5c 00000088 <__vector_2>: 88: 68 94 set 8a: e8 cf rjmp .-48 ; 0x5cAusserdem wird das T-Flag durch die ISR zerstört. Weiter tragisch ist das nicht, weil es nicht von GCC verwendet wird. Aber sonstwo kann man es auch nicht mehr verwenden.
Das in einem globalen Register zu merken geht auch nicht. Das Register kann nur R16-R31 sein, weil R0-R15 kein andi, ori kennen. Und von den Registern kann man keines global machen, ausser evtl. R26, R27, was aber überall zu deutlich mieserem Code führen durfte!







Zitieren

Lesezeichen