Latenzzeiten bei zwei Interrupts

Gast #12613
Lesenswert?
• ▲
▼
Hallo,

weiß jemand zufällig, wie die AVRs damit umgehen, wenn
zwei Interrupts "quasi" gleichzeitig eintrudeln?

Mein Problem ist folgendes:
Ich muß sehr schnell auf einen externen Int. reagieren.
Der Proz. läuft schon mit maximalem Takt.

Bekanntlich kann ein Interrupt einen 2-/3-Takt-Befehl
nicht unterbechen. Wie ist es aber erst, wenn der Atmel
gerade  dabei ist einen niedrigeren Int. auzulösen?
Bekanntlich dauert das Dekodieren hier mind. 4Takte.
Kann das unterbrochen werden?

Beispiel: Der UART meldet TX_Complete und noch bevor
der rjmp auf dem Signalhandler ausgeführt wird, kommt
der externe Int..

Gruß
Axel


P.S. In den Datsheets finde ich dazu nichts und
per Debugger läßt sich das nicht ausprobieren ;-)
Gast #12614
Lesenswert?
• ▲
▼
Hi!
Was du vor hast ist beschissen, wenn die Bearbeitung eines speziellen 
Int.so wichtig ist kannst du nur mit einem fahren und die anderen musst 
du per Flagabfrage lösen. Hast du etwas mehr Zeit (Einsprung) kannst du 
nach dem Einspr. in die ISR das I-Bit erneut setzen und bist in der ISR 
Intfähig. Achte dabei aber gut auf den Stack! Die Sache kann aber sehr 
schnell unübersichtlich werden.
Gruss Uwe
Gast #12615
Lesenswert?
• ▲
▼
Hallo,

ich weiß, daß das kniffelig ist.
Daß ich für weitere Ints erst wieder "sei" machen muß, ist klar.
Die Frage zeilete auch mehr darauf ab, ab wann weitere Ints
gesperrt sind. Ist es möglich, daß sich während der vier Takte noch ein 
weiterer Int. dazwischenschiebt?

Mit dem Stack habe ich übrigens keine Probleme.
Der wichtige Int putzt den Stack und setzt neue
Rücksprungadresse für's reti. ;-)


Gruß
Axel
Gast #12616
Lesenswert?
• ▲
▼
Soweit ich weiß wird der IRQ wärend der bearbeitung eine IRQ Routine 
abgeschaltet. Es kann also bis IRET kein weitere IRQ bearbeitet werden.
Danach werden alle "gespeicherten" IRQ in der Reiehnefolge ihrer 
Priorität abgearbeitet.
Laufende Befehle lassen sich sowieso nicht unterbrechen
Ich hab es noch nicht ausprobiert, aber theoretisch müsste man aber mit 
SEI innerhalb einer IRQ Funktion den IRQ wieder einschalten können. 
Damit solltest Du aber vorsichtig sein das der Stack nicht verwurschtelt 
wird..
Also verbrauchst Du mindestens die Takte für den ersten IRQ Aufruf (z.B. 
UART), evt PUSH Befehle für Registerrettung, SEI Befehl und IRQ Aufruf 
für Deine dringende Funktion. Drunter wird nix gehen. Die PUSH Befehle 
müssen unbedingt VOR SEI ausgeführt werden.

Ansonsten hilft wirklich nur noch alles von Hand Pollen und nur den 
einen IRQ fahren.

Gruß
Markus
http://www.elektronik-projekt.de/
Gast #12617
Lesenswert?
• ▲
▼
Hallo Markus,


daß man sei machen muß, hatte ich im zweiten Beitrag geschrieben,
das ist klar. Um den Stack brauche ich mich doch wohl nur
kümmern, wenn die Interruptroutine auch Register verwurschelt, oder?

Mir geht's darum, ob die vier Takte bis zum Einsprung
in die Interrupttabelle noch unterbrochen werden können
oder nicht.

Gruß
Axel
Gast #12621
Lesenswert?
• ▲
▼
Hallo,

ich habe schon gemacht. Ich muß die SW jetzt aber erweitern.
Die Sache ist ziemlich speziell, da ich gerade tief
in den Eingeweiden von Autoelektronik wühle. Das zu erklären,
würde zu lange dauern.

Sobald die Schaltung fertig ist, kann ich hier ja einen Link
posten.


Gruß
Axel

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 24 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.