Forum: Mikrocontroller und Digitale Elektronik Interruptverarbeitung beim dsPic33fj


von René (Gast)


Lesenswert?

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