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


von Guest (Gast)


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

von Christian R. (supachris)


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

von Guest (Gast)


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

von Christian R. (supachris)


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:
1
The interrupt latency is 6 cycles, starting with the acceptance of an interrupt
2
request, and lasting until the start of execution of the first instruction of the
3
interrupt-service routine, as shown in Figure 2−7. The interrupt logic executes
4
the following:
5
1) Any currently executing instruction is completed.
6
2) The PC, which points to the next instruction, is pushed onto the stack.
7
3) The SR is pushed onto the stack.
8
4) The interrupt with the highest priority is selected if multiple interrupts
9
occurred during the last instruction and are pending for service.
10
5) The interrupt request flag resets automatically on single-source flags.
11
Multiple source flags remain set for servicing by software.
12
6) The SR is cleared. This terminates any low-power mode. Because the GIE
13
bit is cleared, further interrupts are disabled.
14
7) The content of the interrupt vector is loaded into the PC: the program
15
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.

von Guest (Gast)


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

von Christian R. (supachris)


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.

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.