www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Disable global Interrupt in einem Interrupt Service Routine


Autor: Wang Zhou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

kann mir jemand folgende Frage beantworten?
Ich möchte "disable global Interrupt" am Anfang in einem Interrupt 
Service Routine setzen und dann wieder "enable global Interrupt" am Ende 
in diesem Interrupt Service Routine. Ist das OK?

Danke & Grüße
Wang Zhou

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist das OK?

Kommt auf den uC an.

Autor: Ak Tronik (aktronik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Wang Zhou,

technich machbar, allerdings solltest Du in der ISR möglicht wenig 
erledigen wie z.B nur ein Flag setzen. Das Flag fragst Du dann in Deiner 
Hauptschleife ab und rufst dann die eigentliche Funktion auf in der Du 
u.a. den globalen interrupt aus/einschaltest.

MfG
Ak Tronik

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsche Frage.
Wenn der Controller in einen Interrupt geht sind alle Interrupst 
automatisch disabled. Beim asm "reti" am Ende des Interrupt werden sie 
automatisch enabled.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wang Zhou schrieb:
> Ich möchte "disable global Interrupt" am Anfang in einem Interrupt
> Service Routine setzen und dann wieder "enable global Interrupt" am Ende
> in diesem Interrupt Service Routine. Ist das OK?

Nein!

Damit kann es zu ungewolltem Nesting kommen.
Bzw. bei CPUs mit Interruptprioritäten werden diese ausgehebelt.

Überlaß das mal schön der CPU, ob sie gerade in einem Interrupt ist oder 
nicht.


Peter

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
Ich glaube du interpretierst die Frage falsch. Er will am Anfang den 
Interrupt ausschalten. Das ist er ja aber schon.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Er will am Anfang den
>Interrupt ausschalten. Das ist er ja aber schon.

Das kommt immer noch auf die unbekannte CPU an.
Nicht jeder benutzt AVRs.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt keine Controller, egal welcher Firma, wo die Interrups nicht 
automatisch ausgeschaltet werden. Das ist eine logische Quintessenz.

Autor: Wang Zhou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Danke für eure Hilfe!

Naja, aber ich glaube nicht "Wenn der Controller in einen Interrupt geht 
sind alle Interrupst automatisch disabled", weil eine andere Interrupt 
mit höhere Priorität das aktuelle Interrupt abbrechen kann.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Es gibt keine Controller, egal welcher Firma, wo die Interrups nicht
>automatisch ausgeschaltet werden.

Du hast noch viel zu lernen.

Autor: Wang Zhou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze 9S08DN60 von Freescale.

Autor: Michael_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das klingt nach Assembler AVR. Da sollte man es anwenden!
Ich mache es da jedenfalls. Sonst gibt es Ärger.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Das klingt nach Assembler AVR. Da sollte man es anwenden!
>Ich mache es da jedenfalls. Sonst gibt es Ärger.

Bei AVRs: Blödsinn. Schon mal Datenblatt gelesen?

MfG Spess

Autor: Wang Zhou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Ziel ist, dass die aktuelle Interrupt Service Routine reibungslos 
durchgeführt werden soll ohne Abbrechung von andere Interrupt, die 
höhere Priorität hat. Deswegen wird die Disabled global Interrupt am 
Anfang im ISR gesetzt und wieder Enabled am End im ISR.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mein Ziel ist, dass die aktuelle Interrupt Service Routine reibungslos
>durchgeführt werden soll ohne Abbrechung von andere Interrupt, die
>höhere Priorität hat.

Das ist eigentlich nicht ok. Interrupts mit höherer
Priorität haben meistens auch wichtigere Dinge zu tun.
Wunder dich also nicht wenn es merkwürdige Nebeneffekte gibt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Wang

Du machst die Sache nur schlimmer.

Am Anfang kannst du die Interrupts global ausschalten. Das schadet 
nichts obwohl sie ganz sicher automatisch ausgeschaltet sind.

Wenn du am Ende die Interrups aber global einschaltest dann können vor 
verlassen der Interrupt Routine neue Interrups auftreten und der Stack 
wandert in den Keller.

Überlasse das Einschalten der Interrupts der Automatik des reti Befehls 
den du in Assembler programmierst oder den der C Compiler am Ende der 
Routine einbaut.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Am Anfang kannst du die Interrupts global ausschalten. Das schadet
>nichts obwohl sie ganz sicher automatisch ausgeschaltet sind.

Träum weiter in deiner kleinen AVR Welt.
Gute Nacht.

Autor: Wang Zhou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn du am Ende die Interrups aber global einschaltest dann können vor
>verlassen der Interrupt Routine neue Interrups auftreten und der Stack
>wandert in den Keller.
Wenn die global Interrupt am Anfang nicht ausgeschaltet wird, habe ich 
auch gleiches Problem, dass neue Interrupts auftreten können vor 
Verlassen dieser Interrupt.

Autor: Wang Zhou (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@holger
>Das ist eigentlich nicht ok. Interrupts mit höherer
>Priorität haben meistens auch wichtigere Dinge zu tun.
>Wunder dich also nicht wenn es merkwürdige Nebeneffekte gibt.
Es gibt eigentlich kein Nebenwirkung, weil die andere Interrupts einfach 
nur verschoben werden.

Autor: Michael_ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Bei AVRs: "Blödsinn". Schon mal Datenblatt gelesen?
Schon wieder einer, dem die Mutti kein Benehmen gelernt hat!
Ein ext. Int. springt von der Sprungtabelle zu der gezeigten Adresse, 
das war es. Kein Ein- oder Ausschalten von INT. Mindestens bei AVR und 
ASS.
>Mein Ziel ist, dass die aktuelle Interrupt Service Routine reibungslos
>durchgeführt werden soll ohne Abbrechung von andere Interrupt, die
>höhere Priorität hat. Deswegen wird die Disabled global Interrupt am
>Anfang im ISR gesetzt und wieder Enabled am End im ISR.
Mache es, die anderen gehen ja nicht verloren, sie müssen nur ein paar 
Takte warten, bis sie dran sind!

Autor: Eckhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

der S08 schaltet die Interrupt global aus. Beim Eintreten wird das 
Statusregister uaf den Stack gesichert und das I Bit danach gesetzt.
Am ende wird das Statusregster wieder vom Stack gelesen und der alte 
Zusatand des I Bits st wieder hergestellt.

Das disablen und enablen kannst Du Dir also in diesem Fall sparen.
Der Interrupt wird auch nicht durch Interrupts höherer priorität 
unterbrochen.
Wenn während deiner Intteruptverarbeitung weiterer Interrupts auftreten, 
so werden diese nach Beendigung in der Reihenfolge ihrer Prioritäta 
abgearbeitet.

Eckhard

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ein ext. Int. springt von der Sprungtabelle zu der gezeigten Adresse,
>das war es. Kein Ein- oder Ausschalten von INT. Mindestens bei AVR und
>ASS.

Aber nicht, wenn gerade eine andere Interruptroutine abgearbeitet wird.

>Schon wieder einer, dem die Mutti kein Benehmen gelernt hat!

Eher jemand dem Mutti in frühen Jahren Lesen Gelernt hat. Und AVRs 
Programmiere ich seit 12 Jahren in Assembler.

MfG Spess

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mutti haette Euch auch Deutsch lehren sollen :-/

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:
> @Peter
> Ich glaube du interpretierst die Frage falsch. Er will am Anfang den
> Interrupt ausschalten. Das ist er ja aber schon.

Ne, ich habs schon richtig verstanden, er will am Ende enablen.
Das Nesting kann also passieren zwischen diesem überflüssigen Enable und 
dem RETI.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wang Zhou schrieb:
> Ich benutze 9S08DN60 von Freescale.

Was spricht dagegen, dann in dessen Datenblatt zu schauen?
While the CPU is responding to the interrupt, the I bit is automatically set to avoid the possibility of another
interrupt interrupting the ISR itself (this is called nesting of interrupts).

Und vom Enable im Interrupt wird auch eindringlich abgeraten:
In rare cases, the I bit can be cleared
inside an ISR (after clearing the status flag that generated the interrupt) so that other interrupts can be
serviced without waiting for the first service routine to finish. This practice is not recommended for anyone
other than the most experienced programmers because it can lead to subtle program errors that are difficult
to debug.

Wie schon gesagt, laß die CPU ihr Ding machen und pfusche ihr nicht 
rein.


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael_ schrieb:
>>Bei AVRs: "Blödsinn". Schon mal Datenblatt gelesen?
> Schon wieder einer, dem die Mutti kein Benehmen gelernt hat!
> Ein ext. Int. springt von der Sprungtabelle zu der gezeigten Adresse,
> das war es. Kein Ein- oder Ausschalten von INT. Mindestens bei AVR und
> ASS.

Du solltest wirklich den Befehlssatz studieren.
Gerade beim AVR ist es so, dass die CPU beim Einstieg in einen Interrupt 
Handler (ganz egal welcher) automatisch einen "cli" macht und beim 
Rücksprung aus dem Interrupt einen "sei". Der "sei" ist praktisch 
gesehen in den "reti" eingebaut. Ansonsten wäre nämlich auch der "reti" 
komplett überflüssig.

Bei anderen Prozessoren kann und wird das möglicherweise anders sein 
aber beim AVR ist das so.

Und das Selbstverwalten von cli und sei in einem Interrupt Handler kann 
durchaus kontraproduktiv sein. Dadurch kann es passieren, dass die 
Interrupts ein klein wenig zu früh eingeschaltet werden und, wenn die 
nächste Interrupt Bedingung bereits zutrifft, der nächste Interrupt 
schon angesprungen wird, noch ehe der "reti" abgearbeitet wurde -> der 
Stack füllt sich zusehends. Überlässt man hingegen das Verwalten des 
IRQ-Flags der CPU mit ihrem reti, so ist garantiert, dass der nächste 
Interrupt erst dann ausgeführt wird, wenn der vorhergehende vollständig 
abgearbeitet wurde. Und vollständig meint: Auch alle Spuren am Stack 
sind beseitigt.

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.