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
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.