FoCus
08.02.2006, 15:44
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:
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
);
}
Das produziert folgenden Asm 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
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:
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
);
}
Das produziert folgenden Asm 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