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

Gast #1019632
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
Gast #1019652
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 :-)
#1019674
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.
#1020041
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.
Gast #1026156
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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.