Forum: Mikrocontroller und Digitale Elektronik Interrupt Flag wann zurücksetzen


von New D. (newproject)


Lesenswert?

Guten Abend an alle,

Ich habe da mal ein paar verständnisfragen. Es geht um ein PIC18.
Also nehmen wir an, wir haben einen Timer der nach einer Zahl X einen 
Overflow einen Interrupt auslöst.
Also wird nach dem Overflow die entsprechende ISR aufgerufen.
Nach dem Kontrollieren wer das Interrupt ausgelöst hat, kann es 
losgehen.
SO, sobald das ISR aufgerufen wurde, fängt mein Timer währenddem ja 
wieder an von vorne an zu zählen.
Meine Frage ist jetzt ob ich mein CLEAR FLAG direkt am anfang der ISR 
setzen soll, oder erst zum schluss der ISR.

Meine Vermutungen:
1) Cleare ich das FLAG Bit erst ganz zum Schluss, so ist die komplette 
ISR von nem erneuten Aufruf "beschützt". ABER der Timer läuft dennoch 
weiter, heisst dass wenn zumbeispiel genau in dem Moment wo wir in der 
letzten Zeile des ISR das Flag Bit clearen, der Timer überläuft, wird 
die ISR nach dem verlassen dann direkt wieder aufgerufen.

2) Cleare ich das FLAG Bit ganz am Anfang der ISR, könnte doch 
theoretisch die ISR, bevor diese fertig abgearbeitet ist, ja nochmal vom 
Timer aufgerufen werden? Das hängt dann normalerweise von den Priority 
Bits ab? Oder kann generell ein ISR nicht abgebrochen werden von dem 
gleichen Interrupt?

Vielen dank

von Michael L. (michaelx)


Lesenswert?

New D. schrieb:
> Meine Vermutungen:
> 1) Cleare ich das FLAG Bit erst ganz zum Schluss, so ist die komplette
> ISR von nem erneuten Aufruf "beschützt". ABER der Timer läuft dennoch
> weiter, heisst dass wenn zumbeispiel genau in dem Moment wo wir in der
> letzten Zeile des ISR das Flag Bit clearen, der Timer überläuft, wird
> die ISR nach dem verlassen dann direkt wieder aufgerufen.
>
> 2) Cleare ich das FLAG Bit ganz am Anfang der ISR, könnte doch
> theoretisch die ISR, bevor diese fertig abgearbeitet ist, ja nochmal vom
> Timer aufgerufen werden? Das hängt dann normalerweise von den Priority
> Bits ab? Oder kann generell ein ISR nicht abgebrochen werden von dem
> gleichen Interrupt?

Meine Tipps:
1.) Wenn der Timer während der Abarbeitung der ISR tatsächlich erneut 
überlaufen kann, ist das ein Hinweis einen SW-Designfehler.

2.) Wenn du etwas über die Funktion und Wirkungsweise des GIE-Bits 
gelesen hättest, wäre die Frage überflüssig.

2.a) RTFM statt blind Vermutungen anzustellen, kann man nicht oft genug 
sagen.

;-)

von S. R. (svenska)


Lesenswert?

New D. schrieb:
> 2) Cleare ich das FLAG Bit ganz am Anfang der ISR, könnte doch
> theoretisch die ISR, bevor diese fertig abgearbeitet ist, ja nochmal vom
> Timer aufgerufen werden?

Wenn sich eine ISR ohne Grenzen selbst unterbricht, hast du einen Stack 
Overflow gebaut.

von New D. (newproject)


Lesenswert?

Michael L. schrieb:
> New D. schrieb:
>> Meine Vermutungen:
>> 1) Cleare ich das FLAG Bit erst ganz zum Schluss, so ist die komplette
>> ISR von nem erneuten Aufruf "beschützt". ABER der Timer läuft dennoch
>> weiter, heisst dass wenn zumbeispiel genau in dem Moment wo wir in der
>> letzten Zeile des ISR das Flag Bit clearen, der Timer überläuft, wird
>> die ISR nach dem verlassen dann direkt wieder aufgerufen.
>>
>> 2) Cleare ich das FLAG Bit ganz am Anfang der ISR, könnte doch
>> theoretisch die ISR, bevor diese fertig abgearbeitet ist, ja nochmal vom
>> Timer aufgerufen werden? Das hängt dann normalerweise von den Priority
>> Bits ab? Oder kann generell ein ISR nicht abgebrochen werden von dem
>> gleichen Interrupt?
>
> Meine Tipps:
> 1.) Wenn der Timer während der Abarbeitung der ISR tatsächlich erneut
> überlaufen kann, ist das ein Hinweis einen SW-Designfehler.

Im Studium werden aber solche Aufgaben gemacht um genau zu verstehen was 
in solchen Fällen dann passiert.

>
> 2.) Wenn du etwas über die Funktion und Wirkungsweise des GIE-Bits
> gelesen hättest, wäre die Frage überflüssig.
>
> 2.a) RTFM statt blind Vermutungen anzustellen, kann man nicht oft genug
> sagen.


Ja hab eben nochmal durchgelesen. Also wenn IPEN=1 ist, also die 
Prioritäten eingeschaltet sind, kann die ISR durch einen Interrupt mit 
höherer Priorität unterbrochen werden.

Ist IPEN=0 so kann die ISR NICHT abgebrochen werden.

Okay also spielt es eigendlich keine grosse Rolle wann das Flag bit 
gecleared wird, da es sich nicht selbst in der ISR nochmal aufrufen 
kann, da es die gleiche Priorität hat.

Hab ich das jetzt richtig verstanden?


lG

von Klaus (Gast)


Lesenswert?

New D. schrieb:
> Okay also spielt es eigendlich keine grosse Rolle wann das Flag bit
> gecleared wird, da es sich nicht selbst in der ISR nochmal aufrufen
> kann, ...

 ... solange du es nicht explizit erlaubst. Das Flagbit hat auch keinen 
direkten Einfluß darauf, ob ein Interrupt ausgeführt wird, sondern nur 
wann. Für das "ob" gibt es ein Interrupt-Enable-Bit, sowohl für 
einzelne Interrupte als auch global.

Da das Rücksetzen des Flags gern vergessen wird, ist es gut das am 
Anfang zu machen. Dann sieht man schneller, daß es nicht vergessen 
wurde.

MfG Klaus

von Disco (Gast)


Lesenswert?

Wenn du das Flag am Schluss zurücksetzt könnte es sein, dass du eine 
Interrupt verpasst. Grade bei einem Timer wo du vielleicht einen 
Tickcounter hochzählen willst. Wenn z.B. es selten vorkommt, das der 
Interrupt mal länger dauert.

Also am Anfang ist immer besser.

von X. X. (chrissu)


Lesenswert?

Wenn der "Interrupt mal länger dauert" hast Du ebenso einen 
Designfehler...

von Ulrich F. (Gast)


Lesenswert?

Chriss X. schrieb:
> Wenn der "Interrupt mal länger dauert" hast Du ebenso einen
> Designfehler...

Das kann man so pauschal nicht sagen.

Man kann eine solche Prozedur auch "Wiedereintrittsfähig" gestalten.
Muss dann allerdings darauf achten, dass der lang laufende Teil nicht 
mehrfach aufgerufen wird.

Pseudocode:
1
Merker isLong = false;
2
Merker ticks = 0;
3
IRS()
4
{
5
 ticks++;
6
 wenn(ticks >= 500 && !isLong)
7
 {
8
   ticks -= 500;
9
   isLong = true;
10
   erlaubeInts();
11
   tuLangLaufer(); // unterschiedliche Laufzeiten
12
   isLong = false;
13
 }
14
}

Ticks sind hier irgendwelche eintreffenden Ereignisse.
Alle 500 Ticks soll was länger dauerndes gemacht werden.

Es werden alle ticks gezählt auch während der LangLäufer aktiv ist.

Der LangLäufer sollte (im Durchschnitt) innerhalb von 500 Ticks fertig 
werden. Wenn er es ab und zu nicht schafft, ist  es auch nicht schlimm, 
das wird aufgeholt.

Probleme treten auf, wenn der Wertebereich des Merkers ticks 
überschritten wird.

von New D. (newproject)


Lesenswert?

Klaus schrieb:
> New D. schrieb:
>> Okay also spielt es eigendlich keine grosse Rolle wann das Flag bit
>> gecleared wird, da es sich nicht selbst in der ISR nochmal aufrufen
>> kann, ...
>
>  ... solange du es nicht explizit erlaubst. Das Flagbit hat auch keinen
> direkten Einfluß darauf, ob ein Interrupt ausgeführt wird, sondern nur
> wann. Für das "ob" gibt es ein Interrupt-Enable-Bit, sowohl für
> einzelne Interrupte als auch global.


Disco schrieb:
> Wenn du das Flag am Schluss zurücksetzt könnte es sein, dass du
> eine
> Interrupt verpasst. Grade bei einem Timer wo du vielleicht einen
> Tickcounter hochzählen willst. Wenn z.B. es selten vorkommt, das der
> Interrupt mal länger dauert.


Wie meinst du verpassen? Ich dachte doch dass die ISR die gerade von nem 
Timer ausgelöst wurde, nicht nochmal von dem gleichen Timer unterbrochen 
werden kann, egal ob das Flag am Anfang oder am Ende zurückgesetzt 
wurde?

Da ist noch irgendwo ein Denkfehler bei mir.

Danke

von Disco (Gast)


Lesenswert?

Wenn das Flag gar nicht gelöscht wird, wird der Interrupt sofort nach 
Rückkehr wieder gestartet. Wenn ich es früher lösche kann es auch noch 
einmal gesetzt werden löscht man es später kann dieses 2. Setzen nicht 
mehr unterschieden werden.

das schlechte Design steht übrigens nicht zur Debatte wenn es um die 
speziellen Abläufe geht.

von Michael L. (michaelx)


Lesenswert?

New D. schrieb:
> Wie meinst du verpassen? Ich dachte doch dass die ISR die gerade von nem
> Timer ausgelöst wurde, nicht nochmal von dem gleichen Timer unterbrochen
> werden kann, egal ob das Flag am Anfang oder am Ende zurückgesetzt
> wurde?

Nein, die ISR kann nicht durch den gleichen Timer unterbrochen werden, 
weil GIE beim Sprung in die ISR auf 0 gesetzt wird, und erst beim RETFIE 
wieder auf 1. Natürlich kannst du GIE auch in der ISR wieder auf 1 
setzen, aber das zu tun ist ziemlich dämlich.

von Ulrich F. (Gast)


Lesenswert?

Michael L. schrieb:
> aber das zu tun ist ziemlich dämlich.

Ist es das?
Immer?
Das große, oder das kleine Immer?


Die Alternative?
In der ISR ein Flag setzen und dieses Flag dann in der main-loop 
pollen...
Pollen ist dämlich, wenn man denn schon einen Interrupt nutzt.
Hier das kleine dämlich, denn es kommt auf die Umstände an....


Wobei...
PIC ist nicht so mein Ding...
Wenn man Interrupts mindestens 2 Ebenen stapeln kann, gehts.

von Michael L. (michaelx)


Lesenswert?

Ulrich F. schrieb:
> Michael L. schrieb:
>> aber das zu tun ist ziemlich dämlich.
>
> Ist es das?
> Immer?
> Das große, oder das kleine Immer?
>
>
> Die Alternative?
> In der ISR ein Flag setzen und dieses Flag dann in der main-loop
> pollen...
> Pollen ist dämlich, wenn man denn schon einen Interrupt nutzt.
> Hier das kleine dämlich, denn es kommt auf die Umstände an....

Das liest sich so, als ob du keine Ahnung hast, was das GIE eigentlich 
ist und bewirkt.

Dein obiges Geschreibsel von der wiedereintrittsfähigen ISR ist auch 
nicht wirklich sinnvoll. Damit kannst du Newbies beeindrucken, oder 
besser gesagt total verwirren.

Hier noch mal zur Klarstellung:

1. Die ISR wird komplett abgearbeitet, und nicht durch einen Interrupt 
der gleichen Priorität unterbrochen. Warum, das habe ich schoon erklärt, 
und deswegen muss die ISR auch nicht wiedereintrittsfähig sein.

2. Wenn Interruptereignisse (z.B. vom Timer) in schnellerer Folge 
ausgelöst werden, als diese von der ISR abgearbeitet werden können, dann 
ist das ganz klar ein Desigenfehler, den man auch nicht mit einer 
wiedereintrittsfähigen ISR beheben könnte.

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.