Hallo, ich habe mal eine Frage zum Interrupthandling des dsPic33. Aktuell setze ich das Modell fj128gp706A ein. Laut Instructiontable unterstützen die dsPics die Assembleranweisung DISI #lit14 (Disable Interrupts for k instruction cycles), welche die Ausführung von User-ISRs für die nächsten k cycles deaktiviert. Wenn man sich nun ein Macro bauen würde, welches wie folgt ausschaut #define INTERRUPT_PROTECT(x) { \ asm volatile("disi #0x3FFF"); /* disable interrupts */ \ x; \ asm volatile("disi #0x0000"); /* enable interrupts */ \ } (void)0; wäre es doch teoretisch möglich über einen entsprechenden Aufruf den jeweiligen Code interrupt geschützt auszuführen. Nun habe ich mir das Datenblatt, genauer die Sektion Interrupt angesehen. Dort steht beschrieben, dass ein deaktivieren des Interrupt Nestings (NSTDIS control bit (INTCON1<15>)) die Prioritäten der UserInterrupts auf 7 setzt, was folglich die DISI-Anweisung aushebeln würde, da die ausschließlich für Prioritäten <7 wirkt. Sehe ich das somit richtig, das ein Interrupt geschützter Aufruf einer Funktion lediglich durch die von Microchip vorgegebenen Implementierungen möglich ist, und ich die DISI-Anweisung für meinen Fall nicht verwenden kann? Das nesting von Interrupts ist deaktiviert! Auszug Datenblatt void enableInterrupts(void) { /* Set CPU IPL to 0, enable level 1-7 interrupts */ /* No restoring of previous CPU IPL state performed here */ SRbits.IPL = 0; return; } void disableInterrupts(void) { /* Set CPU IPL to 7, disable level 1-7 interrupts */ /* No saving of current CPU IPL setting performed here */ SRbits.IPL = 7; return; } Gruß René
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.