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
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
Hab gerade die Antwort gefunden http://www.mikrocontroller.net/articles/Interrupt genial dieses Forum :) mfg benedikt
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.