ATM32: Interruptroutine zeitoptimieren - was ist noch möglich?

Gast #1019632
Lesenswert?

Hallo,

bei einem Atmega32 soll als Reaktion auf einen Externen Interrupt ein
Pin gesetzt werden. Funktioniert soweit auch prima. Allerdings dauert 
das ganze vom Setzen des Interrupteingangs bis die steigende Flanke am 
Ausgang auf High-Pegel ist ganze 4µs.

Die 4µs passen ungefähr zur länge des von GCC erzeugten Maschinencodes.

Das Datenblat sagtt, daß die minimale Reaktionszeit 4 Taktzyklen 
beträgt. Das wären dann 500ns. Da ist natürlich die Ausführung des 
eigentlichen Anwendungsprozesses nicht mit drin. Aber für die ganzen 
Stackoperationen benötigt der compilierte Code alleine deutlich länger, 
als diese 500ns
(weil insgesamt mehr Funktionen als für 4 Zyklen sind).

Gibt es irgendwelche Standardverfahren, wie man genau diese Sache 
schneller machen kann, d.h. Interrupt -> Pin setzen? Evtl. die Sicherung 
der Register vor den Funktionsaufruf ziehen (wenn man weiß, daß als 
nächstes nur der interrupt kommen kann)?. Kann man die 
Vergleichsoperationen irgendwei vorbereiten?
1
SIGNAL(SIG_INTERRUPT0)
2
{
3
     PORTD |= (1<<PD1);
4
     PORTD &= ~(1<<PD1);
5
}

Assemblercode wird heute nachmittag nachgeliefert.

Gruß,
Harald
#1020041
Lesenswert?

Siehe unter 
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html 
unter "Manually defined ISRs" (Oben im Text).
1
ISR(INT0_vect, ISR_NAKED)
2
{
3
  PORTD |= (1<<PD1);
4
  PORTD &= ~(1<<PD1);  // results in SBI/CBI which does not affect SREG
5
  reti();
6
}

Voraussetzung ist allerdings dass auf dem jeweilige AVR der PORTx per 
sbi/cbi erreichbar ist. Das sieht man ja im erzeugten Assembler Listing.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren