Forum: Mikrocontroller und Digitale Elektronik Frage zu ISR


von Fabian K. (fabian_k)


Lesenswert?

Hallo,

Im AVR-GCC Tut liest man: "Zu langen Code nicht in die ISR!"
Meint der Autor damit, dass es mich vielleicht stören könnte, dass
das Hauptprogramm unterbrochen wird, bis die ISR zu Ende ist?
Oder ist das "schlecht" für den uC?

Danke im vorraus
Fabian

von Thomas K. (Gast)


Lesenswert?

Vielleicht gehen Interrupts verloren wenn die ISR schneller aufgerufen 
wird als sie zum Abarbeiten braucht.

Meist hat man ja auch verschiedene Interrupts und da wirds dann 
unübersichtlich.

von a no nym (Gast)


Lesenswert?

Fabian K. schrieb:
> Oder ist das "schlecht" für den uC?
Nein, dem ist das egal.

> Meint der Autor damit, dass es mich vielleicht stören könnte, dass
> das Hauptprogramm unterbrochen wird, bis die ISR zu Ende ist?
Ja, während der Interrupt abgearbeitet wird sind alle anderen gesperrt 
(I-Flag im SREG ist 0).

von Route_66 (Gast)


Lesenswert?

Hallo!
Schlecht für den uC ist es nicht. Es gibt Programme, die bestehen nur 
aus INT-Routinen. Die Hauptschleife ist dann sogar leer. Das ist dann 
aber häufig bei Prozessoren, wo die einzelnen INTs sich gegenseitig 
unterbrechen können und eine Priorität vorgegeben werden kann.

von a no nym (Gast)


Lesenswert?

a no nym schrieb:
>> Meint der Autor damit, dass es mich vielleicht stören könnte, dass
>> das Hauptprogramm unterbrochen wird, bis die ISR zu Ende ist?
> Ja, während der Interrupt abgearbeitet wird sind alle anderen gesperrt
> (I-Flag im SREG ist 0).

Und das Hauptprogramm ist natürlich auch unterbrochen während der 
Interrupt läuft.

von ziegenpeter (Gast)


Lesenswert?

Fabian K. schrieb:
> Meint der Autor damit, dass es mich vielleicht stören könnte

Weniger dich, als den korrekten Programmablauf.
Bei sowas schleichen sich gerne mal Fehler ein, wo Leute dann nicht 
drauf kommen, dass es daran liegt, dass das Programm zu lange in der ISR 
ist.

von Fabian K. (fabian_k)


Lesenswert?

Ich habe einen ADC-ISR und einen Timer-ISR. Dabei kann es schon mal 
vorkommen, dass während des ADC-ISR ein Timer-Interrupt-Flag gesetzt 
wird. Setzt sich ein Interrupt-Flag nach einer bestimmten Zeit wieder 
von selbst zurueck? Das wäre schlecht.

von Karl H. (kbuchegg)


Lesenswert?

Fabian K. schrieb:
> Ich habe einen ADC-ISR und einen Timer-ISR. Dabei kann es schon mal
> vorkommen, dass während des ADC-ISR ein Timer-Interrupt-Flag gesetzt
> wird. Setzt sich ein Interrupt-Flag nach einer bestimmten Zeit wieder
> von selbst zurueck?

Nein.

Aber was ist, wann deine ADC ISR zu lange rumtrödelt, so dass in der 
Zwischenzeit 2 Timer-Interrupts auftreten? Durch das Flag kannst du 
immer nur einen Interrupt-Aufruf merken, so dass der zweite (eigentlich 
der erste) Timer-Interrupt "verloren" geht. Sprich: Der µC merkt sich 
nur, dass in der Zwischenzeit ein bestimmter Timer-Interrupt aufgetreten 
ist. Nicht aber wieviele.

von Fabian K. (fabian_k)


Lesenswert?

OK, egal. Nur Timer bekommt ISR, der hat eindeutig Vorang.
Danke für die Antworten.

von ziegenpeter (Gast)


Lesenswert?

Was musst du großartiges in einer ADC-ISR machen, ausser den Wert in 
eine Variable oder Ring-Puffer zu speichern und evtl. eine neue Messung 
anzustoßen? Das kann ja nicht so lange dauern.

von Karl H. (kbuchegg)


Lesenswert?

Fabian K. schrieb:
> OK, egal. Nur Timer bekommt ISR, der hat eindeutig Vorang.

Darum gehts nicht.
Wenn dein ADC Interrupt den Wert vom ADC holt und in einer globalen 
Variablen zwischenspeichert, dann ist das eine Aktion die so schnell 
vorbei ist, dass du nicht in das Problem reinlaufen wirst.

Wein dein ADC Interrupt aber mit dem geholten Wert noch eine 
quadratische Interpolation macht, aus einer Tabelle den Messwert 
umredchnet, den Wert in einen Textstring verwandelt und den per UART 
ausgibt, möglichst noch mit 80 Zeichen erklärendem Text drumherum und 
dabei auch noch wartet bis von der Gegenstelle Antwort kommt um dann den 
Text auch noch auf dem LCD auszugeben, dann wirst du Gefahr laufen, dass 
du in der Zwischenzeit ein paar Timer Interrupts verpasst.

von Fabian K. (fabian_k)


Lesenswert?

Karl Heinz Buchegger schrieb:
> quadratische Interpolation
Ich weiß zwar nicht was das ist (: ,
aber ich müsste danach noch eine Berechnung durchführen (in g).
Aber bevor das Risiko besteht, dass der Timer-ISR einmal nicht 
aufgerufen wird, mach ichs ohne ADC-ISR.

von Sam .. (sam1994)


Lesenswert?

Es ist auch möglich in der ADC-ISR nach abholen des Wertes die glob. 
Int. wieder erlauben, dadurch kann die ISR unterbrochen werden und es 
geht kein Timerint. verloren.

von Karl H. (kbuchegg)


Lesenswert?

Fabian K. schrieb:
> Karl Heinz Buchegger schrieb:
>> quadratische Interpolation
> Ich weiß zwar nicht was das ist (:

Ich auch nicht.
Ich hab nur nach eine Wortschöpfung gesucht, die nach "viel 
Rechenarbeit" geklungen hat.

> aber ich müsste danach noch eine Berechnung durchführen (in g).

Machs so, wie man das gemeinhin macht:
Setz dir eine globale Variable auf 1 (ein sog. Jobflag) und mach die 
Berechnung in der Hauptschleife.

> Aber bevor das Risiko besteht, dass der Timer-ISR einmal nicht
> aufgerufen wird, mach ichs ohne ADC-ISR.

Wenn du dir das sowieso leisten kannst, dann ist das die bessere Lösung.
Gerade ADC Abfragen sind meistens nicht zeitkritisch. Genauso wie 
Tasterabfragen nicht zeitkritisch sind und trotzdem aus unerfindlichen 
Gründen immer wieder gerne mal über Interrupts gemacht werden.

von Fabian K. (fabian_k)


Lesenswert?

OK, werds dann so machen.

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.