Forum: Mikrocontroller und Digitale Elektronik ATM32: Interruptroutine zeitoptimieren - was ist noch möglich?


von Harald (Gast)


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

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?


von Gast (Gast)


Lesenswert?

Du setzt den Pin nicht nur, sonden löscht ihn auch wieder.
Alleiniges setzen müßte am schnellsten gehen, wenn man anstelle des 
Interruptvektors die Befehle SBI und RETI schreibt :-)

von (prx) A. K. (prx)


Lesenswert?

Es sollte möglich sein, die Interrupt-Routine als "naked" Funktion zu 
definieren und exakt die 3 nötigen Befehle reinzuschreiben (sbi PORTD,1; 
cbi PORTD,1; reti). Zu sichern gibt es in diesem Fall ja nichts, da 
nichts verändert wird.

von Werner B. (werner-b)


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.

von Harald (Gast)


Angehängte Dateien:

Lesenswert?

Mit Inlineassembler scheint mein GCC hier ein Problem zu haben...
...sieht von euch jemand, wo´s klemmt und was mir GCC mit der 
Fehlermeldung sagen will? (vgl. Screenshot).

Gruß,
Harald

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.