www.mikrocontroller.net

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


Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
SIGNAL(SIG_INTERRUPT0)
{
     PORTD |= (1<<PD1);
     PORTD &= ~(1<<PD1);
}

Assemblercode wird heute nachmittag nachgeliefert.

Gruß,
Harald

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner B. (werner-b)
Datum:

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

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

Autor: Harald (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.