www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Diverse Interrupt Fragen (Eclipse, mspgcc)


Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salu zusammen

Ich bin hier gerade an einem Projekt welches ich sehr genau 
dokumentieren sollte. So, nun habe ich aber ein kleines Problem mit den 
Interruptroutinen.

Umgebung:

- MSP430F149
- Eclipse mit mspgcc

Frage 1:

Wenn ich in einen Interrupt eintrete, muss ich dann die anderen 
Interrupts sperren, oder kann ein Interrupt normalerweise nicht 
unterbrochen werden? Gibt ja so viel ich weiss beide Philosophien, also 
explizit abschalten, oder explizit einschalten. Wie wird das beim MSP 
gelöst?

Frage 2:

Wenn es denn so ist, dass ich in den Interrupt reinkomme und als erstes 
die Interrupts abschalte, kann ja rein theoretisch, in der Zeit zwischen 
aufrufen der Interruptroutine und dem abschalten der Interrupts, ein 
neuer (anderer) Interrupt auftreten. Wie kann man das umgehen? Wie lange 
ist die Zeit in der das passieren kann? Denke die Register werden ja 
auch noch gesichert bei einem Interrupt Eintritt.

Würde mich echt freuen wenn jemand eine Antwort auf Lager hat. Irgendwie 
kapier ich das mit den Interrupts nicht so ganz :o) Vielen Dank schon 
einmal

Gruss

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sobald ein Interrupt soweit durch die Logik ist, dass die ISR 
angesprungen wird, werden alle Interrupts gesperrt. Will man 
verschachtelte Interrupts, muss man die in der ISR wieder freigeben. Im 
GCC gibts dafür auch ein Attibut, "nested" glaube ich.
http://mspgcc.sourceforge.net/manual/x580.html

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salu Supachris

Vielen Dank für die Info. Da war ich wohl falsch informiert. Ich dachte 
es sei genau umgekehrt, also das man sie explizit sperren muss.

Kann man etwas über die Zeit sagen in der rein theoretisch zwei 
Interrupts möglich wären. Also der erste Interrupt löst aus, der zweite 
kommt aber bereits bevor der erste in die IRQ gesprungen ist und die 
Interrupts abgeschaltet hat? Ist das vernachlässigbar?

Gruss

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hättest den User Guide gelesen, wüsstest du, dass diese Schritte in 
Hardware ablaufen. Für gleichzeites Anlieger mehrerer Interrupts gibts 
die Prioritäten. Hier noch mal aus dem Uder Guide:
The interrupt latency is 6 cycles, starting with the acceptance of an interrupt
request, and lasting until the start of execution of the first instruction of the
interrupt-service routine, as shown in Figure 2−7. The interrupt logic executes
the following:
1) Any currently executing instruction is completed.
2) The PC, which points to the next instruction, is pushed onto the stack.
3) The SR is pushed onto the stack.
4) The interrupt with the highest priority is selected if multiple interrupts
occurred during the last instruction and are pending for service.
5) The interrupt request flag resets automatically on single-source flags.
Multiple source flags remain set for servicing by software.
6) The SR is cleared. This terminates any low-power mode. Because the GIE
bit is cleared, further interrupts are disabled.
7) The content of the interrupt vector is loaded into the PC: the program
continues with the interrupt service routine at that address.

Theoretisch könnte jetzt zwischen 4 und 6 ein neuer Interrupt kommen. Da 
aber die CPU zu der Zeit sowieso keinen Befehl ausführt und die 
Interrupt-Logik die Kontrolle hat, ist sichergestellt, dass es diesen 
unkontrollierten Zustand nicht gibt. Der neue Interrupt wird dann nach 
dem ersten abgearbeitet, also direkt nach dem 1. RETI.
Leider gibts keine konkrete Innenschaltung der Interrupt-Logik, aber es 
wäre schon ein fataler Fehler, wenn TI nicth daran gedacht hätte.

Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Supachris, genau das wollte ich wissen. Habe die Seite schon 
gelesen, so ists nicht :o) aber genau das meinte ich, dass zwischen 4 
und 6 eigentlich ein Interrupt auftreten könnte. Ist mir jetzt aber 
klar, da er ja wirklich "nichts" macht.

Gruss

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guest wrote:
> Danke Supachris, genau das wollte ich wissen. Habe die Seite schon
> gelesen, so ists nicht :o) aber genau das meinte ich, dass zwischen 4
> und 6 eigentlich ein Interrupt auftreten könnte. Ist mir jetzt aber
> klar, da er ja wirklich "nichts" macht.

Naja, man hoffts zumindest, und aus der Beschreibung geht es so hervor. 
Zumal es 6 Takte sind, bis man in der ISR ist, und die gehen schon für 2 
bis 7 drauf. Da bleibt eigentlich keine Zeit, um zwischen 2 Takten noch 
irgendwas reinzuschieben. Die Interrupts werden dann halt in dem 
entsprechenden Peripheriebaustein gespeichert und anschließend 
ausgeführt.

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.