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.