-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Interrupt während eines Interrupts

  1. #1

    Interrupt während eines Interrupts

    Anzeige

    Hallo kurze Frage an Atmel Assembler Experten,

    ist es eine ordentliche und auch funktionierende Programmierung wenn ich einer Interruptroutine ISR jederzeit Vorrang geben möchte (externes Signal auf INT0) aber auch einen untergeordneten Interrupt (TIMER0 overflow) so zu lassen möchte das der TIMER0 overfow Interrupt auftreten kann aber von dem übergeordneten Interrupt INT0 unterbrochen werden kann (indem ich einfach in der ISR des Timer0 den cli Befehl weglasse) und nach Abarbeitung der ISR von INT0 der Atmel MEGA 8 wieder zurück in die ISR des Timer0 springt ohne das Fehler auftauchen und damit beide ISR in der von mir vorgegebenen Priorität sauber abgearbeitet werden und sich dann der Prozessor wieder seinem Hauptprogramm widmet?

    Danke
    Gruß
    Thomas

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    32
    Beiträge
    4.255
    Vielleicht solltest du das Problem in mehr als einem(!) Satz schildern, dann versteht man auch besser was du willst...

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Dito. Auch mehrmals durchgelesen, aber nicht wirklich dahintergekommen.
    Welcher Interrupt soll welchen unterbrechen dürfen?
    Bei normalen AVRs gibts nur 1 Priorität (bzw. 2, aber die höheren sind dann die NMI wie Reset, Brownout etc.)
    #ifndef MfG
    #define MfG

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Nicht einfach, aber so etwa kann man das Problem schon verstehen.

    Man kann in einer ISR den Interrupt wieder frei geben. Das sperren geht automatisch muss also nicht in Software per CLI erfolgen. Man kann den Interrupt nur wieder frei geben per SEI. Das ist durchaus in Ordnung, man muss aber etwas aufpassen was man macht.

    Problematisch wird es aber wenn sich eine ISR sozusagen selber unterbricht. Bei einem Timer Interrupt kann man das oft ausschließen, bei einem externen Interrupt ist das aber nicht so so sicher. Notfalls kann sich helfen, indem man erst den Speiziellen Interrupt der die ISR ausgelöst hat sperrt und erst dann per SEI global interrupts frei gibt. Wegen des extra Aufwandes ist das aber oft auch kleine Lösung, weil dann noch weniger Zeit zur Verfügung steht.

    Zusätzlich muss man den höheren Platzbedarf auf den Stack berücksichtigen. Eventuell ist dann auch die Reihenfolge in der die Interrupts abgearbeitet werden nicht ganz die die man erwartet.

  5. #5
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.996
    Hallo!

    Ich kenne AVR's nicht genug um mitreden zu können. Theoretisch sollte aber jeder Interrupt so lange bestehen, bis entsprechendes Interrupt Flag (IF) in Interrupt Service Routine (ISR) gelöscht wird. Deswegen sollte es möglich sein durch Festlegung der Reihenfolge, in der die IF's in ISR geprüft werden, eigene Prioritäten zu setzen.

    Sollte bei AVR's nicht so sein, dann bitte meine Antwort nicht berücksichtigen und vergessen.

    MfG

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Bei den AVRs gibt es für jede Interruptquelle eine eigene ISR. Man muss also nicht erst von Hand nachprüfen wo der Interrupt her kommt. In den meisten Fällen werden die Interrupt Flags auch gleich von der Hardware gelöscht. Wenn gleichzeitig mehrere Interrupts anstehen, gibt es eine feste Reihenfolge.

    Die Zeit bis zum möglichen wieder erlauben von Interrupts ist auch nicht besonders lang. Das sollten 4 Zyklen für den eigentlichen Interrupt, meistens 2 Zyklen für den RJMP in die eigentliche ISR und 1 (+1) Zyklen für das setzen des I. Flags sein. Dazu dann ggf. noch etwa 2-3 Zyklen um den gleichen Interrupt zu sperren. Aber selbst wenn eine Interrupt sich selbst unterbricht muss das noch nicht zu einen Absturz führen - es braucht nur viel Stack und der letzte Interrupt wird zuerst abgearbeitet (falls es denn einen Unterschied macht).

  7. #7
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.996
    Danke sehr für deine ausführliche Erklärung.

    Dank dir lerne ich die AVR's immer besser kennen, die ich vielleicht mal anwende, wenn ein PIC für mich nicht mehr ausreicht.

    MfG

  8. #8
    Super vielen Dank für die vielen Antworten (und sorry für die nicht verständliche Beschreibung). Aufgrund eurer Antworten erinnere ich mich gelesen zu haben das die Interrupt Flags automatisch bei Start eines Interrups zurück gesetzt werden und ich denke ich werde den ersten Versuch starten indem ich den unterbrechbaren Timer Interrupt mit SEI starte und dann mal sehen ob die Theorie zu dem Thema auch praktisch stand hält. Ich bin auch gespannt ob der Stack zurecht kommt, ich hatte mal was von max. 3 Sprüngen in Unterprogramme gelesen?, aber das werde ich nicht erreichen, auch wenn der INT0 den Timer Interrupt zeitweise aus bremst.

    Hier ist im übrigen das ganze Carrera Digital Projekt zu sehen was eigentlich schon abgeschlossen ist und jetzt "nur" noch um eine zeitliche Überwachung zu ergänzen wäre, denn der im Projekt eingesetzte Sender (ELV 986Mhz) darf "nur" 36 Sekunden senden (was bei dieser ersten Variante genau 1800 Runden pro Stunde sind-später möchte ich andere Sende und Empfangsmodule ausprobieren bei denen eine höhere Übertragungsrate und andere Übertragungsverfahren möglich sind damit dürften die zu fahrenden Runden sich wesentlich erhöhen--auch wenn es eigentlich keiner braucht ).

    http://www.youtube.com/watch?v=RpTwfAQT7-s

    Vielen Dank
    Gruß
    Thomas

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.05.2007
    Ort
    Stolberg
    Beiträge
    111
    Du benötigst einfach doppelt so viel Stack für die IRQs. Es hängt von Deiner Implementation ab, wieviel Bytes von der jeweiligen Interruptroutine auf den Stack gepusht werden, mindestens jedoch der Platz für die Rücksprungaddresse. Ansonsten ist das mit zwei Interruptebenen durchaus OK, in der avr-libc gibt es dafür die beiden Konstanten ISR_BLOCK und ISR_NOBLOCK, die man dem ISR Macro als zweiten Parameter übergeben kann.

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Begrenzung aus etwa 3 Unterprogrammaufrufe gilt für AVRs ohne SRAM. Beim Mega8 hat man aber einiges SRAM zu verfügung. Das Limit ist da eher bei rund 400.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •