PIC - kann sich die ISR selbst unterbrechen?

OP #3644269
Lesenswert?

guten abend,

heute habe ich eine ziemliche Grundlagenfrage dabei.

ich nutze eine einzige ISR in meinem PIC Programm. Wird diese 
aufgerufen, fragt sie alle möglichen Interrupt flags der Reihe nach ab
1
void interrupt high_priority ISR_highPriority()
2
{
3
    if(INTCONbits.INT0F == 1)
4
    {
5
        INTCONbits.INT0F = 0;
6
        Int0_Code();
7
    }
8

9

10
    if(PIR5bits.TMR5IF == 1)
11
    {
12
        PIR5bits.TMR5IF = 0;                    // clear interrupt flag
13
        Timer5_Code();
14
    }
15
...
16
}


nun liest man ja im Datenblatt allerhand über Prioritäten von 
Interrupts. Im Quelltext gibt es aber nur eine einzige Routine.

Nun meine Fragen:
- kann sich die Routine selbst unterbrechen? Also wenn z.B. timer 5 
zündet und er den entsprechenden quelltext abarbeitet und dann eine 
Flanke an INT0 auftaucht. Wird dann eine neue ISR gestartet? Oder wird 
die ISR erst dann gleich nochmal gestartet, wenn der alte Aufruf 
durchgelaufen ist?
- was wenn gerade der INT0-Bereich abgearbeitet wird und währenddessen 
der timer 5 alarm schlägt? Da ich kein return am Ende des 
INT0-Quelltexts habe, könnte derselbe ISR-Aufruf direkt in die 
timer5-routine laufen. Das wäre ja nicht weiter tragisch, aber gibt's 
dann danach noch einen zweiten ISR-Aufruf, in dem nichts mehr passiert?

dank euch...
lg
#3644289
Lesenswert?

A. S. schrieb:
> Nun meine Fragen:
> - kann sich die Routine selbst unterbrechen? Also wenn z.B. timer 5
> zündet und er den entsprechenden quelltext abarbeitet und dann eine
> Flanke an INT0 auftaucht. Wird dann eine neue ISR gestartet? Oder wird
> die ISR erst dann gleich nochmal gestartet, wenn der alte Aufruf
> durchgelaufen ist?

Letzteres.

> - was wenn gerade der INT0-Bereich abgearbeitet wird und währenddessen
> der timer 5 alarm schlägt? Da ich kein return am Ende des
> INT0-Quelltexts habe, könnte derselbe ISR-Aufruf direkt in die
> timer5-routine laufen. Das wäre ja nicht weiter tragisch, aber gibt's
> dann danach noch einen zweiten ISR-Aufruf, in dem nichts mehr passiert?

Es wird so laufen, wie du schon selber geschrieben hast. Am Ende der ISR 
sind beide Flags gelöscht und es gibt keine erneute Unterbrechung wenn 
das GIE wieder freigegeben ist.

> dank euch...
> lg

Edit: Im vorigen Post habe ich die Assembler-Instruktion retfie 
angesprochen, die du möglicherweise gar nicht kennst weil das der 
C-Compiler für dich erledigt. Dieser Befehl kennzeichnet das Ende einer 
ISR und bringt die CPU wieder in den "normalen Modus" zurück.
#3644534
Lesenswert?

Carsten M. schrieb:
> Das alles hängt natürlich auch davon ab, von welchem PIC hier die Rede
> ist!?

Tut es nicht. Ein einziger Blick auf den vom TE geposteten Code reicht 
übrigens aus um zu sehen, dass es sich um PIC18 handelt.

> Manche haben nur eine ISR andere zwei (high and low priority) und manche
> haben für jede int source eine eigene mit eigenen Prioritäten.

Meine Antworten stimmen sowohl für PIC mit nur einem Interrupt als auch 
für PIC18 mit seinen zwei Interrupt-Vektoren.
#3647278
Lesenswert?

Carsten M. schrieb:
> Hat jemand gesagt, dass deine Antworten nicht stimmen?
> Chill mal ..

Hallo? Ich habe nicht gepostet um mich zu rechtfertigen sondern um hier 
ein paar eindeutige und richtige Angaben zu ergänzen. Für den TE, der 
die Frage gestellt hat. Du wurdest zitiert weil deine Aussage nicht 
stimmt, das muss man in einem Fachforum schon aushalten können, Carsten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren