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