Frage zu ISR

OP #2311730
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
Gast #2311737
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).
Gast #2311739
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.
Gast #2311748
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.
#2311765
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.
#2311773
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.
#2311809
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.

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