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
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
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.
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
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.
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
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.
>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.
@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.
>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.
>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.
@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.
>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!
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
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
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
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.