Forum: Mikrocontroller und Digitale Elektronik MSP430 GIE nachträgliches Interrupt auslösen


von Benedikt (Gast)


Lesenswert?

Hallo,

ich hätte eine Frage zum MSP430 die ich mir leider durch die 
Datenblätter nicht beantworten kann, vielleicht hat ja jemand bereits 
Erfahrung damit.

und zwar würde ich gerne eine art CriticalSection-Funktion bauen in der 
kurz Variablenwerte geändert werden aber hald wärenddessen kein anderer 
Code (ISRs) ausgeführt werden sollen

was soweit auch kein Problem ist indem ich mit _DINT() und danach mit 
_EINT() die Interrupts aktiviere und deaktiviere

nun aber zu meiner Frage:
wenn wärend der Zeitspanne wo ich die Interrupts ausgeschaltet habe ein 
Interrupt auftreten würde, wird dieser dann nachträglich (wenn der 
Interrupt wieder aktiviert wird) ausgelöst?

Das einzige was ich zu dem Thema in Datenblättern finden konnte ist der 
Satz aus msp430f1232 Seite 9 vorletzte Zeile:

(Non)-maskable: the individual interrupt enable bit can disable an 
interrupt event, but the general interrupt enable cannot.

Soll das jetzt heißen GIE ist unnütz weil es eh keine interrupts 
deaktiveren kann (was ja nicht wirklich stimmt) oder soll damit 
angemerkt werden das man das machen kann was ich will nur ist es da hald 
etwas knapper formuliert?

mfg Benedikt

von Arc N. (arc)


Lesenswert?

Benedikt wrote:
> nun aber zu meiner Frage:
> wenn wärend der Zeitspanne wo ich die Interrupts ausgeschaltet habe ein
> Interrupt auftreten würde, wird dieser dann nachträglich (wenn der
> Interrupt wieder aktiviert wird) ausgelöst?

Ja (afair...)

> Das einzige was ich zu dem Thema in Datenblättern finden konnte ist der
> Satz aus msp430f1232 Seite 9 vorletzte Zeile:

Die eigentlich Erklärungen sind in den User Guides nicht in den 
Datenblättern (MSP430x1xx Family User's Guide (Rev. F) etc.)

> (Non)-maskable: the individual interrupt enable bit can disable an
> interrupt event, but the general interrupt enable cannot.
>
> Soll das jetzt heißen GIE ist unnütz weil es eh keine interrupts
> deaktiveren kann (was ja nicht wirklich stimmt) oder soll damit
> angemerkt werden das man das machen kann was ich will nur ist es da hald
> etwas knapper formuliert?

Nein, nicht maskierbar sind Reset/NMI, Flash-Zugriffsfehler und 
Oszillator-Fehler d.h. wenn bspw. ein Oszillator-Fehler auftritt und der 
entsprechende Interrupt eingeschaltet ist (OFIE) wird dieser Interrupt 
ausgeführt, egal ob GIE an oder aus ist.

> mfg Benedikt

von Benedikt (Gast)


Lesenswert?

Hab gerade die Antwort gefunden
http://www.mikrocontroller.net/articles/Interrupt

genial dieses Forum
:)

mfg benedikt

von Benedikt (Gast)


Lesenswert?

THX Arc für die schnelle antwort.

von Stefan (Gast)


Lesenswert?

Vielleicht noch als Ergänzung:

>und zwar würde ich gerne eine art CriticalSection-Funktion bauen in der
>kurz Variablenwerte geändert werden aber hald wärenddessen kein anderer
>Code (ISRs) ausgeführt werden sollen.
>was soweit auch kein Problem ist indem ich mit _DINT() und danach mit
>_EINT() die Interrupts aktiviere und deaktiviere

Genau das kann/wird Dir zum Verhängnis werden!
Nehmen wir an, Du bist in einem Programmteil, in dem die IRQ's gesperrt 
sind (GIE=0). Aus diesem Teil rufst Du nun Deine Funktion 
"CriticalSection()" auf, die beim Rücksprung die IRQ's aber nun 
freigibt, obwohl sie vorher gesperrt waren...!

In IAR gibt es dafür die sogenannte Monitor-Funktion
(z.B. __monitor void CriticalSection(void) ).
Monitorfunktionen verbieten während ihrer Ausführung die IRQ's und 
stellen bei ihrer Beendigung den vorherigen Status wieder her.

Alternativ kannst Du z.B. das Statusregister (GIE-Bit) sichern und beim 
Beenden Deiner Funktion wiederherstellen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.