Hi,
muss in einer c-Funktion aus Zeitgründen Asm verwenden. Bisher musste ich hierfür allerdings noch nie einen Wert zurückgeben.
Problem:
Ich muss in einer Interruptroutine so schnell wie möglich Port D lesen.
Ich habe hierfür folgende Routine erstellt:
Das produziert folgenden Asm CodeCode:volatile unsigned char G_cLastData = 0xAA; EXTINT_INTERRUPT_HANDLER(SIG_INTERRUPT0){ asm volatile( "IN %0, %1" "\n\t" : "=r" (G_cLastData) //Output : "I" (_SFR_IO_ADDR(PORTD)) //Input ); }
Code:EXTINT_INTERRUPT_HANDLER(SIG_INTERRUPT0){ d70: 1f 92 push r1 d72: 0f 92 push r0 d74: 0f b6 in r0, 0x3f ; 63 d76: 0f 92 push r0 d78: 11 24 eor r1, r1 d7a: 8f 93 push r24 d7c: cf 93 push r28 d7e: df 93 push r29 d80: cd b7 in r28, 0x3d ; 61 d82: de b7 in r29, 0x3e ; 62 asm volatile( d84: 82 b3 in r24, 0x12 ; 18 d86: 80 93 79 00 sts 0x0079, r24 d8a: 80 91 79 00 lds r24, 0x0079 d8e: df 91 pop r29 d90: cf 91 pop r28 d92: 8f 91 pop r24 d94: 0f 90 pop r0 d96: 0f be out 0x3f, r0 ; 63 d98: 0f 90 pop r0 d9a: 1f 90 pop r1 d9c: 18 95 reti
Meine Fragen nun:
-Funktioniert das so?
-Wie kann ich dem Compiler sagen, dass er mir den Stack vorher nicht aufräumen muss, da im Code die Register nicht verwendet werden?
Gruss
Michael







Zitieren

Lesezeichen