Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage Interrupts


von Max Wo (Gast)


Lesenswert?

Hallo! Eine Frage bzgl. Interrupts auf einem ATmega324.

Wenn bei der Ausführung einer ISR (z.B. durch einen PCINT) währenddessen 
ein weiterer Interrupt (z.B. durch einen weiteren PCINT oder TOVF) 
kommt, was passiert? Werden die anderen ISRs direkt danach ausgeführt? 
Werden sie übersprungen?

Kann eine ISR generell "unterbrochen" werden durch andere Interrupts?

von S. Landolt (Gast)


Lesenswert?

> Werden die anderen ISRs direkt danach ausgeführt?
Ja, nachdem im Hauptprogramm der nächste Befehl ausgeführt wurde. 
Reihenfolge ergibt sich aus der Reihenfolge in der Vektortabelle.

> Kann eine ISR generell "unterbrochen" werden durch andere Interrupts?
Prinzipiell ja, indem man in der ISR durch ein sei die Interrupts 
global wieder freigibt - man sollte aber sehr genau wissen, was man da 
tut.

von S. Landolt (Gast)


Lesenswert?

PS:
> Werden sie übersprungen?
Nein, natürlich nicht; die betreffenden Interrupt-Flags bleiben ja 
gesetzt, bis sie (im Regelfall) hardwaremäßig beim Einsprung in die ISR 
gelöscht werden.

von Klaus S. (kseege)


Lesenswert?

S. Landolt schrieb:
>> Kann eine ISR generell "unterbrochen" werden durch andere Interrupts?
> Prinzipiell ja, indem man in der ISR durch ein sei die Interrupts
> global wieder freigibt - man sollte aber sehr genau wissen, was man da
> tut.

Nach meiner Erfahrung funktionieren "nested Interrupts" genauso wie 
einfache Interrupts, man braucht nur mehr Platz auf dem Stack. Wüßte 
nicht, was da anders wäre.

Gruß Klaus (der soundsovielte)

von Wolfgang (Gast)


Lesenswert?

S. Landolt schrieb:
>> Werden die anderen ISRs direkt danach ausgeführt?
> Ja, nachdem im Hauptprogramm der nächste Befehl ausgeführt wurde.

Oder schon vorher, nachdem in der laufenden Interruptroutine Interrupts 
über das global interrupt Flag wieder freigegeben wurden.

von HildeK (Gast)


Lesenswert?

Max Wo schrieb:
> Kann eine ISR generell "unterbrochen" werden durch andere Interrupts?

Kann, wie aus den Antworten hervorgeht, wenn man das gezielt will. Ohne 
weitere Maßnahmen wird meines Wissens nur ein weiterer IRQ gespeichert 
und nach Beenden der ersten ISR ausgeführt. Liegen weitere an, würden 
die verloren gehen - ich lasse mich aber gerne eines Besseren belehren 
:-)

von c-hater (Gast)


Lesenswert?

Klaus S. schrieb:

> Nach meiner Erfahrung funktionieren "nested Interrupts" genauso wie
> einfache Interrupts, man braucht nur mehr Platz auf dem Stack.

Das ist erstmal grundsätzlich so.

> Wüßte
> nicht, was da anders wäre.

Es besteht die Gefahr, sich selbst zu "nesten". Dann wächst der Stack 
bis BUMM.

Diese Gefahr besteht prinzipiell für alle ISRs, sobald es auch nur 
einen einzigen Interrupt im System gibt, bei dem die maximale 
Interruptfolgefrequenz nicht vorhersagbar ist, sprich: letztlich aus 
einer äußeren Quelle stammt. Und das ist bei ziemlich vielen Interrupts 
der Fall (entweder generell oder zumindest als Möglichkeit in bestimmten 
Betriebsarten).

Wohlgemerkt: die unterbrechbar gemachte ISR kann für sich selber sicher 
sein (z.B. OVF eines Timers alle 100µs, gesamte ISR-Laufzeit 80µs), aber 
durch einen anderen Interrupt so sehr heruntergebremst werden, dass 
das Nesting für die Timer-ISR eintritt, obwohl die selber eigentlich 
garnicht Schuld daran ist.

von Axel S. (a-za-z0-9)


Lesenswert?

HildeK schrieb:
> Max Wo schrieb:
>> Kann eine ISR generell "unterbrochen" werden durch andere Interrupts?
>
> Kann, wie aus den Antworten hervorgeht, wenn man das gezielt will. Ohne
> weitere Maßnahmen wird meines Wissens nur ein weiterer IRQ gespeichert
> und nach Beenden der ersten ISR ausgeführt.

Das ist nicht richtig. Bzw. nur halb. Von jeder Interrupt-Quelle wird 
nur ein Interrupt gespeichert.

Jeder Interrupt hat ein Pending-Bit (abfragbar als Interrupt-Flag). Wenn 
das globale Interrupt-Enable Flag gesetzt ist (per SEI) wird die 
zugehörige ISR ausgeführt. Wenn mehrere Falgs gleichzeitig gesetzt 
werden, das mit der höchsten Priorität (niedrigste Vektor-Adresse) 
zuerst.

Immer wenn das globale Interrupt-Enable Flag gesetzt wird, wird noch 
genau ein weiterer Befehl ausgeführt bevor die Pending Flags honoriert 
werden. Normalerweise wird beim Einsprung in eine ISR das Bit 
automatisch gelöscht und beim Verlassen automatisch wieder gesetzt. 
Daraus resultiert das beschriebene Verhalten.

So lange noch Interrupts Pending sind, wird das System also die 
zugehörigen ISRs ausführen (immer mit einen Befehl dazwischen). Wenn ein 
Interrupt erneut ausgelöst wird, während er noch Pending ist, dann geht 
das Event verloren. Es gibt ja nur ein Bit pro Interrupt.

von Klaus S. (kseege)


Lesenswert?

HildeK schrieb:
> Kann, wie aus den Antworten hervorgeht, wenn man das gezielt will. Ohne
> weitere Maßnahmen wird meines Wissens nur ein weiterer IRQ gespeichert
> und nach Beenden der ersten ISR ausgeführt

Das ist richtig für den Fall, daß während der ISR derselbe Interrupt 
noch einmal auftritt und das Interruptflag bereits gelöscht ist, 
ansonsten landet auch schon der zweite Interrupt im Nirvana. Dann ist 
aber der Programmierer dringend reif für eine Fortbildung!

Gruß Klaus (der soundsovielte)

von Klaus S. (kseege)


Lesenswert?

c-hater schrieb:
> Es besteht die Gefahr, sich selbst zu "nesten". Dann wächst der Stack
> bis BUMM.

Kennst Du einen Prozessor, dessen Interruptcontroller das ermöglicht? 
Das täte mich gewaltig interessieren. Kann mir nur schlecht vorstellen, 
daß ein Hersteller das Vorstellen einer solchen Mißgeburt finanziell 
üerlebt.

Der einzige Trick dazu wäre m.E., in der ISR die eigene 
Interruptpriority herunterzusetzen. Das ist dann aber Vorsatz!

Gruß Klaus (der soundsovielte)

von c-hater (Gast)


Lesenswert?

Klaus S. schrieb:

> Kennst Du einen Prozessor, dessen Interruptcontroller das ermöglicht?

AVR8 (klassisch)

Wobei die eben gerade keinen Interruptcontroller im üblichen Sinne 
besitzen.

von S. Landolt (Gast)


Lesenswert?

> AVR8 (klassisch)
Eben. 'Max Wo' fragte nach dem ATmega324 - und ist mit der Diskussion 
hier mittlerweile wahrscheinlich überfordert, wenn ich seine Fragen 
richtig einordne.

von Wolfgang (Gast)


Lesenswert?

c-hater schrieb:
> Diese Gefahr besteht prinzipiell für alle ISRs, sobald es auch nur
> einen einzigen Interrupt im System gibt, bei dem die maximale
> Interruptfolgefrequenz nicht vorhersagbar ist, sprich: letztlich aus
> einer äußeren Quelle stammt.

Das ist kein spezielles Problem von Interrupts. Bei rekursivem Aufruf 
von Funktionen/Unterprogrammen kann der Stack genauso explodieren.

von Teo D. (teoderix)


Lesenswert?

Klaus S. schrieb:
> c-hater schrieb:
>> Es besteht die Gefahr, sich selbst zu "nesten". Dann wächst der Stack
>> bis BUMM.
>
> Kennst Du einen Prozessor, dessen Interruptcontroller das ermöglicht?
> Das täte mich gewaltig interessieren. Kann mir nur schlecht vorstellen,
> daß ein Hersteller das Vorstellen einer solchen Mißgeburt finanziell
> üerlebt.

Meines wissen alle Pics.
Da muss, wie wahrscheinlich auch bei vielen anderen, das zugehörige 
IR-Flag explizit gelöscht werden. Da is es dann dir überlassen, ob Du 
das am Anfang o. am Ende der Routine machst.
Und wenn Du es mal wirklich krachen lassen willst, löscht Du es einfach 
gar nicht. ;)

von Wolfgang (Gast)


Lesenswert?

Klaus S. schrieb:
> Kennst Du einen Prozessor, dessen Interruptcontroller das ermöglicht?

Der ATmega324 hat da nicht viel zu bieten.
Die Möglichkeit besteht bei jedem Controller, wenn der Interrupt durch 
einen Pegel ausgelöst wird und man in der Interruptroutine den Interrupt 
direkt wieder freigibt.

von c-hater (Gast)


Lesenswert?

Wolfgang schrieb:

> Das ist kein spezielles Problem von Interrupts. Bei rekursivem Aufruf
> von Funktionen/Unterprogrammen kann der Stack genauso explodieren.

Natürlich. Deswegen vermeidet man Rekursionen, wann immer es geht. Auch 
wenn das weniger "elegant" aussieht...

von MaWin (Gast)


Lesenswert?

Wolfgang schrieb:
> Das ist kein spezielles Problem von Interrupts. Bei rekursivem Aufruf
> von Funktionen/Unterprogrammen kann der Stack genauso explodieren.

Das Besondere bei Interrupts ist aber, dass das Verhalten oft von 
außerhalb des Controllers ausgelöst werden kann. z.B. durch Glitches an 
Pins. Und deshalb sehr schwer zu debuggen ist.

von Wolfgang (Gast)


Lesenswert?

c-hater schrieb:
> Deswegen vermeidet man Rekursionen, wann immer es geht.

Rekursionen verwendet man genau dann, wenn sie eine besonders effektive 
Abbildung des Problems erlauben.
Soll man sich da künstlich verbiegen und einen fehlerträchtigen Murks 
drumrum stricken?

von MaWin (Gast)


Lesenswert?

Wolfgang schrieb:
> Soll man sich da künstlich verbiegen und einen fehlerträchtigen Murks
> drumrum stricken?

Was soll man von C-Hatern auch schon erwarten.

von c-hater (Gast)


Lesenswert?

Wolfgang schrieb:

> c-hater schrieb:
>> Deswegen vermeidet man Rekursionen, wann immer es geht.
>
> Rekursionen verwendet man genau dann, wenn sie eine besonders effektive
> Abbildung des Problems erlauben.

Nein. Das verkneift man sich. Das tuen nur praxisferne Akademiker, die 
das Problem der endlichen Ressourcen erstmal "ausklammern" (und dann 
instantan vergessen).

Erst, wenn sie auf ihre dumme Schnauze gefallen sind, bauen sie dann 
typisch wenigstens eine Beschränkung der Rekursionstiefe ein.

Das sieht dann allerdings auch schon wesentlich weniger elegant aus ;o)

von MaWin (Gast)


Lesenswert?

c-hater schrieb:
> Das tuen nur praxisferne Akademiker, die
> das Problem der endlichen Ressourcen erstmal "ausklammern" (und dann
> instantan vergessen).

Man kann und sollte Rekursionen natürlich begrenzen, damit eben keine 
unendlich große Ressourcenalloziierung passieren kann.
Versteht sich von selbst.

von EAF (Gast)


Lesenswert?

Ausnahmsweise möchte ich hier dem C Hasser minimal zustimmen!

Rekursion ist ein Pattern, welches jeder Programmierer kennen und 
beherrschen können sollte.

Festhalten kann man:
Eine infinite Rekursion ist tödlich, egal auf welchem System

Vor Jahrzehnten wurde schon festgestellt, dass Rekursionen in allen 
Fällen auf Iterationen zurückgeführt werden können. Das ist das Mittel, 
um solche Geschichten auf kleinen µC verwertbar zu bekommen.

Ein System mit MMU, oder anderen Schutzeinrichtungen, kann ein 
Überlaufen des Stacks verhindern/unterbinden.
Aber auf den kleinen AVR kann der Stack in den Heap oder andere 
Datenspeicherbereiche rein rasseln. Drum verstehe ich die Abneigung 
gegen Rekursion. Kann sie aber nicht assimilieren.

von MaWin (Gast)


Lesenswert?

EAF schrieb:
> Vor Jahrzehnten wurde schon festgestellt, dass Rekursionen in allen
> Fällen auf Iterationen zurückgeführt werden können.

Was das Ressourcenproblem nicht löst.

von Klaus S. (kseege)


Lesenswert?

Teo D. schrieb:
> Meines wissen alle Pics.
> Da muss, wie wahrscheinlich auch bei vielen anderen, das zugehörige
> IR-Flag explizit gelöscht werden. Da is es dann dir überlassen, ob Du
> das am Anfang o. am Ende der Routine machst.
> Und wenn Du es mal wirklich krachen lassen willst, löscht Du es einfach
> gar nicht. ;)

Ich kenne die PICs nur von den paar Malen, wo ich ihr Datenblatt gelesen 
habe und sie als zu klein aussortiert habe. Aber ein beliebig 
herausgegriffenes sagt:
--------------------
The PIC18(L)F2X/4XK22 devices have multiple
interrupt sources and an interrupt priority feature that
allows most interrupt sources to be assigned a high or
low priority level (INT0 does not have a priority bit, it is
always a high priority). The high priority interrupt vector
is at 0008h and the low priority interrupt vector is at
0018h. A high priority interrupt event will interrupt a low
priority interrupt that may be in progress.
----------------------
Der hat also sowieso nur zwei Interruptvektoren und sowas wie Rekursion 
geht damit nicht, wie nach meinem Veständnis das Datenblatt klar und 
deutlich aussagt. Und lösche ich das IR-Flag nicht, wird die ISR einfach 
wieder und wieder aufgerufen. Das ist der normale vorhersehbare und 
einplanbare Programmverlauf, da "kracht" gar nix.
Legt man sein Programm passend an, kann man in der Low-Prio-ISR sein 
Hauptprogramm unterbringen (loop() im Arduino-Sprech) und spart eine 
Rücksprunganweisung.

von Teo D. (teoderix)


Lesenswert?

@Klaus S
Achne, dämlich Haarspalterei und Themen schön verwoben, das mach mal 
alleine bitte.

von Klaus S. (kseege)


Lesenswert?

c-hater schrieb:
>> Kennst Du einen Prozessor, dessen Interruptcontroller das ermöglicht?
>
> AVR8 (klassisch)

Das muß ich nachprüfen. So einen Schwachpunkt hatte ich nicht erwartet. 
Ausprobiert habe ich selbst, ob das Verschachteln funktioniert, da das 
Datenblatt wenig darüber aussagt. Da das einwandfrei ablief, habe ich 
nicht weiter getestet. Auch in dem auf mc.net vorrätigen Artikel steht 
nur Wachsweiches. Wenn das aber so ist, muß ich wohl schnell wieder zum 
8051 zurückkehren, wenn ich etwas kleineres als den XMC1000 oder STM32 
brauche.

von Klaus W. (mfgkw)


Lesenswert?

MaWin schrieb:
> EAF schrieb:
>> Vor Jahrzehnten wurde schon festgestellt, dass Rekursionen in allen
>> Fällen auf Iterationen zurückgeführt werden können.
>
> Was das Ressourcenproblem nicht löst.

Doch.

Zumindest in den Fällen, wo pro Schritt keine weiteren Resourcen 
benötigt werden.
Wenn man dann Rekursion verwendet, wird pro Stufe ein Funktionsaufruf 
ausgeführt, der Rücksprungadresse, Stackpointer, Framepointer etc. auf 
den Stack legen muß.
Wenn man die Rekursion durch Iteration ersetzt, ist das nicht nötig.

von Klaus S. (kseege)


Lesenswert?

Wolfgang schrieb:
> Klaus S. schrieb:
>> Kennst Du einen Prozessor, dessen Interruptcontroller das ermöglicht?
>
> Die Möglichkeit besteht bei jedem Controller, wenn der Interrupt durch
> einen Pegel ausgelöst wird und man in der Interruptroutine den Interrupt
> direkt wieder freigibt.

Alle Controller (mit Ausnahme des AVR), mit denen ich verschachtelte 
Interrupts  programmiert habe, hatten im Datenblatt eindeutig stehen, 
daß nur Interrupts höherer Prio eine ISR unterbrechen können. Auch die 
PICs machen es so. Man kann sich also maximal sein Hauptprogramm auf 
Geschwindigkeit 0 herunterregeln, ansonsten laufen die Interrupts brav 
weiter wie sie programmiert wurden. Und der Stack bleibt sauber bis der 
Stom ausfällt.

von MaWin (Gast)


Lesenswert?

Klaus W. schrieb:
> Doch.
>
> Zumindest in den Fällen, wo pro Schritt keine weiteren Resourcen
> benötigt werden.

Was natürlich praktisch niemals vorkommt.

Ein Algorithmus, der und begrenzt lange läuft und trotzdem begrenzt 
Speicher braucht und sinnvolle Arbeit leisten kann. Also auch keinen 
ungewünschten Int-Überlauf produzieren kann, weil das ja äquivalent zu 
einer fehlgeschlagenen Alloziierung eines größeren Int ist.
Was wäre das zum Beispiel?

von MaWin (Gast)


Lesenswert?

MaWin schrieb:
> und begrenzt

unbegrenzt

von Mombert H. (mh_mh)


Lesenswert?

MaWin schrieb:
> Klaus W. schrieb:
>> Doch.
>>
>> Zumindest in den Fällen, wo pro Schritt keine weiteren Resourcen
>> benötigt werden.
>
> Was natürlich praktisch niemals vorkommt.
>
> Ein Algorithmus, der und begrenzt lange läuft und trotzdem begrenzt
> Speicher braucht und sinnvolle Arbeit leisten kann. Also auch keinen
> ungewünschten Int-Überlauf produzieren kann, weil das ja äquivalent zu
> einer fehlgeschlagenen Alloziierung eines größeren Int ist.
> Was wäre das zum Beispiel?

Soll das "unbegrenzte" statt "und begrenzte" heißen? Bedeutet das, dass 
ihr noch über die
EAF schrieb:
> infinite Rekursion
redet?

von MaWin (Gast)


Lesenswert?

Klaus S. schrieb:
> ansonsten laufen die Interrupts brav
> weiter wie sie programmiert wurden

Wenn sie denn genügend Speicher haben.
Das Problem ist, dass die Stackauslastung nichtdeterministisch ist und 
die maximale Auslastung sehr schwer zu ermitteln ist, weil sie vom 
IRQ-Timing abhängt.
Und das theoretische Maximum - alle IRQs laufen zugleich mit maximaler 
Schachteltiefe - überschreitet sehr schnell kleine Speicher von kleinen 
Controllern.

von Wolfgang (Gast)


Lesenswert?

Klaus S. schrieb:
> Legt man sein Programm passend an, kann man in der Low-Prio-ISR sein
> Hauptprogramm unterbringen (loop() im Arduino-Sprech) und spart eine
> Rücksprunganweisung.

loop() ist auch bei Arduino kein Hauptprogramm, sondern eine Funktion, 
die vom Hauptprogramm aufgerufen wird.

von Peter D. (peda)


Lesenswert?

Klaus S. schrieb:
> Nach meiner Erfahrung funktionieren "nested Interrupts" genauso wie
> einfache Interrupts, man braucht nur mehr Platz auf dem Stack. Wüßte
> nicht, was da anders wäre.

Der große Unterschied ist, daß der AVR Interruptprioritäten nicht in 
Hardware unterstützt. Daher kann sich ein Interrupt unbegrenzt selber 
unterbrechen nach einem SEI. Z.B. beim Levelinterrupt, EEPROM, UART, I2C 
geht das voll in die Hose. Die müssen sich vor dem SEI immer erst selber 
disablen. Die Interruptproblematik habe ich schon 1997 bei einem 
AVR-Seminar bemängelt, stieß aber auf taube Ohren.

Ganz anders die 8051. Z.B. der AT89LP51 hat 2 Prioritätsbits je 
Interruptquelle, d.h. ein Interrupt kann sich default nicht selber 
unterbrechen. Um sich selber zu unterbrechen, muß ein Interrupt seine 
eigene Priorität erhöhen. Das kann er 3-mal, dann ist Schluß. Also max 4 
Instanzen sind möglich. Insbesondere für jitterarme Timerinterrupts 
machen sich die Prioritätsbits hervorragend (Audio-PWM, Steppermotoren 
usw.).

Die AVRs wurden bestimmt nicht wegen ihrer rückständigen Interruptlogik 
populär, sondern wegen ihrer einfachen Anwendung (interner Takt, Reset, 
ISP, weiter Spannungsbereich, freier und gut benutzbarer GCC (WINAVR).
Ich denke mal, der WINAVR war sogar der Hauptpunkt, den AVR populär zu 
machen. Ich hab den auch noch lange nach 2010 benutzt.

von MCUA (Gast)


Lesenswert?

>Die AVRs wurden bestimmt nicht wegen ihrer rückständigen Interruptlogik
>populär,..

Stimmt.
Höchste Zeit, dass MCH das mal ändert.

von Peter D. (peda)


Lesenswert?

MCUA schrieb:
> Höchste Zeit, dass MCH das mal ändert.

Es gibt zaghafte Ansätze. Bei den neueren AVRs kann man eine 
Interruptquelle hochsetzen. Auch kann man die low-level Interrupts als 
Round-Robin konfigurieren, d.h. jeder kommt mal dran.

von Klaus S. (kseege)


Lesenswert?

c-hater schrieb:
> AVR8 (klassisch)
> Wobei die eben gerade keinen Interruptcontroller im üblichen Sinne
> besitzen.

Peter D. schrieb:
> Der große Unterschied ist, daß der AVR Interruptprioritäten nicht in
> Hardware unterstützt. Daher kann sich ein Interrupt unbegrenzt selber
> unterbrechen nach einem SEI. Z.B. beim Levelinterrupt, EEPROM, UART, I2C
> geht das voll in die Hose. Die müssen sich vor dem SEI immer erst selber
> disablen. Die Interruptproblematik habe ich schon 1997 bei einem
> AVR-Seminar bemängelt, stieß aber auf taube Ohren.

Ich würde gern an dem Thema dranbleiben, da es mir doch einen (weit 
verbreiteten) Sonderfall darzustellen scheint und weil ich etwas 
dazulernen möchte.

Im Interrupttutorial steht der intelligente Satz, daß verschachtelte 
Interrupts unwichtig sind, da 99,9% es nicht brauchen. Danach wäre das 
ganze mc.net überflüssig, da bei 3000 eingetragenen Benutzern und der 
10fachen Menge Gästen die 0,1% der deutschsprachigen Bevölkerung nicht 
erreicht sind.
Im speziellen AVR-Interrupttutorial steht vorsichtshalber gar nichts 
dazu.

Für mich sind verschachtelte Interrupts die einfachste Methode, 
prioritätsgesteuertes "preemptive multitasking" hinzubekommen. Scheduler 
und Dispatcher sind in Hardware vorhanden. Programmiert man nicht wie in 
DOS-Zeiten (resp. nach SPS-Muster), sondern ereignisgesteuert wie in 
Windows, gibt es m.E. nichts Einfacheres.
(Siehe auch "Super Simple Tasker" von Rob Ward und Miro Samir.)

Für den AVR hieße das, das man seine eigenen Prioritäten dadurch 
vergeben kann, daß man vor dem GlobalInterruptEnable alle Interrupts 
niedriger Prio ausmaskiert. Da wäre meine Frage, ob da, abgesehen von 
der Fummelei mit verteilten Bits, auch noch Timingprobleme durch 
verzögerte Weitergabe der Flaginformation entstehen. Die Verzögerungen 
durch das Löschen der Enablebits möge mir bitte,bitte,bitte keiner 
erklären. Macht man prioritätsgesteuertes Multitasking, muß nicht jede 
ISR so kurz wie möglich sein.

Weiß da jemand etwas Näheres?

Gruß Klaus (der soundsovielte)

von Klaus S. (kseege)


Lesenswert?

Klaus S. schrieb:
> Für den AVR hieße das, das man seine eigenen Prioritäten dadurch
> vergeben kann, daß man vor dem GlobalInterruptEnable alle Interrupts
> niedriger Prio ausmaskiert.

Für die ganz Genauen sollte das heißen:
Für den AVR hieße das, das man seine eigenen Prioritäten dadurch 
vergeben kann, daß man vor dem GlobalInterruptEnable alle Interrupts 
niedrigerer_ und _gleicher Prio ausmaskiert.

von c-hater (Gast)


Lesenswert?

Klaus S. schrieb:

> Weiß da jemand etwas Näheres?

Nun, ich weiß, dass es ziemlicher Schwachsinn ist, den AVR8 als Basis zu 
wählen, wenn das Ziel "präemptives Multitasking" ist.

Und ich weiß außerdem, dass es durchaus möglich ist, eine Anwendung auf 
dem AVR8 hinzubekommen, die nur aus ISRs besteht (die teilweise auch 
unterbrechbar sind, also Prioritäten implementieren).
Das Gesamtwerk agiert dann im Endeffekt genauso, wie mit "präemptiven 
Multitasking", bloß viel, viel effizienter...

von Oliver S. (oliverso)


Lesenswert?

Klaus S. schrieb:
> Für mich sind verschachtelte Interrupts die einfachste Methode,
> prioritätsgesteuertes "preemptive multitasking" hinzubekommen. Scheduler
> und Dispatcher sind in Hardware vorhanden. Programmiert man nicht wie in
> DOS-Zeiten (resp. nach SPS-Muster), sondern ereignisgesteuert wie in
> Windows, gibt es m.E. nichts Einfacheres.
> (Siehe auch "Super Simple Tasker" von Rob Ward und Miro Samir.)

Ja.

Und jetzt diskutierst du bitte den Sinn von preemptive Multitasking auf 
AVRs.

Oliver

von Klaus S. (kseege)


Lesenswert?

c-hater schrieb:
> Das Gesamtwerk agiert dann im Endeffekt genauso, wie mit "präemptiven
> Multitasking", bloß viel, viel effizienter...

Ich meinte, ausreichend darauf hingewiesen zu haben (15:38 heutigen 
Datums):
"Für mich sind verschachtelte Interrupts die einfachste Methode, 
prioritätsgesteuertes "preemptive multitasking" hinzubekommen."

Ein FlameWar über Worte ist nicht meine Baustelle. Im Übrigen fand Linus 
Pauling schon vor Jahren Leute "crazy", die einen Laser mit einem PC 
steuern wollen. Ich gehöre demnach ohnehin schon zur Gruppe der "crazy 
people", wie andere Firmen auch. Jeder hat das Recht, sich zum Narren zu 
machen, wie er möchte und Menschen mit begrenztem Horizont stehen an 
jeder Straßenecke. Ich will mich da auch gar nicht ausnehmen. Deswegen 
interessieren mich ja die Fakten, aber nicht die alternativen nach 
Trump-Manier.


Oliver S. schrieb:
> Und jetzt diskutierst du bitte den Sinn von preemptive Multitasking auf
> AVRs.
Hier ein kleines Beispiel aus den Tiefen des Internets, sogar ganz 
feudal mit EDF-Scheduling:
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.489.2370&rep=rep1&type=pdf
Den Sinn darfst Du Dir dazuerfinden. Die ganze uns bekannte Welt hat 
keinen eingebauten Sinn, außer für Theologen. Ich bin keiner. Noch 
Fragen?

Mit einem amüsierten Lächeln
Klaus (der soundsovielte)
P.S.Ist das jetzt eher drollig oder trollig? Sorry, couldn't resist.

von Teo D. (teoderix)


Lesenswert?

Klaus S. schrieb:
> P.S.Ist das jetzt eher drollig oder trollig? Sorry, couldn't resist.

Nö, nur Posing, du ><(()°> .... Nein kein Troll, das ist ein Hecht.


rofel
Teo

von Klaus S. (kseege)


Lesenswert?

Klaus S. schrieb:
> Im Übrigen fand Linus Pauling ...

So ein Quatsch, natürlich Linus Torvalds !!!!!

von H.Joachim S. (crazyhorse)


Lesenswert?

Peter D. schrieb:
> habe ich schon 1997 bei einem AVR-Seminar bemängelt

Eins der fast schon legendären MSC-Seminare mit dem coolen Norweger und 
dem Elchbraten am Abend? Vom AVR ist nicht viel übrig geblieben, aber 
Elchbraten ist immer noch ein highlight für mich.

von Kurt (Gast)


Lesenswert?

Wenn es denn den  Max Wo (Gast)  interessieren würde:

Bei ATmega und ATtiny gilt:
Ausgelöste Interruptanforderungen (Interruptflags) bleiben gesetzt, bis 
sie in einer Interruptroutine behandelt, oder bewusst gelöscht wurden. 
Das geschilderte Problem ist also keines.

Andersherum wird es kritisch:
Wird eine Interruptanforderung nicht vor dem erneuten Auftreten der 
gleichen Interruptanforderung bearbeitet, hat das Programm 
zwischenzeitliche Zustände nicht erfasst.

Da muss Programmierer/in GENAU wissen, ob das nachteilige Auswirkungen 
haben könnte und ggfs. was dagegen tun.

von Hugo H. (hugo_hu)


Lesenswert?


: Bearbeitet durch User
von Max Wo (Gast)


Lesenswert?

Hallo und vielen Dank für eure Antworten und die lebhafte Diskussion ;-) 
Blicke jetzt deutlich klarer durch.

Grüße

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.