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
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.
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).
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.
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.
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.
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.
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.
OK, egal. Nur Timer bekommt ISR, der hat eindeutig Vorang. Danke für die Antworten.
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.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.